我开发了一个多平台程序(使用FLTK工具包)并实现多线程来执行后台密集型任务。
我已经关注多线程的FLTK教程/示例,其中涉及在Mac上使用pthread,即函数pthread_create
和Windows上的窗口线程,即_beginthread
我注意到Windows上的性能要高得多,即在这些后台线程中(执行它们的时间)快3到4倍。
为什么会这样?是我使用的线程库吗?当然不应该有这样的差异吗?或者它可能是它下面的运行时库吗?
这是我的机器详情
的Mac:
Intel(R)Core(TM)i7-3820QM CPU @ 2.70GHz
16 GB DDR3 1600 MHz
型号MacBookPro9,1
操作系统:Mac OSX 10.8.5
视窗:
Intel(R)Core(TM)i7-3520M CPU @ 2.90GHz
16 GB DDR3 1600 MHz
型号:戴尔Latitude E5530
操作系统:Windows 7 Service Pack 1
修改
为了进行基本的速度比较,我在从命令行运行的两台机器上编译了它
int main(int agrc, char **argv)
{
time_t t = time(NULL);
tm* tt=localtime(&t);
std::stringstream s;
s<< std::setfill('0')<<std::setw(2)<<tt->tm_mday<<"/"<<std::setw(2)<<tt->tm_mon+1<<"/"<< std::setw(4)<<tt->tm_year+1900<<" "<< std::setw(2)<<tt->tm_hour<<":"<<std::setw(2)<<tt->tm_min<<":"<<std::setw(2)<<tt->tm_sec;
std::cout<<"1: "<<s.str()<<std::endl;
double sum=0;
for (int i=0;i<100000000;i++){
double ii=i*0.123456789;
sum=sum+sin(ii)*cos(ii);
}
t = time(NULL);
tt=localtime(&t);
s.str("");
s<< std::setfill('0')<<std::setw(2)<<tt->tm_mday<<"/"<<std::setw(2)<<tt->tm_mon+1<<"/"<< std::setw(4)<<tt->tm_year+1900<<" "<< std::setw(2)<<tt->tm_hour<<":"<<std::setw(2)<<tt->tm_min<<":"<<std::setw(2)<<tt->tm_sec;
std::cout<<"2: "<<s.str()<<std::endl;
}
Windows只需不到一秒钟。 Mac需要4/5秒。有什么想法吗?
在Mac上我用g ++编译,在Windows上使用visual studio 2013。
第二次编辑
如果我改变了行
std::cout<<"2: "<<s.str()<<std::endl;
到
std::cout<<"2: "<<s.str()<<" "<<sum<<std::endl;
然后Windows突然变得更长一点......
这让我觉得整个事情可能是编译器优化。所以问题是g ++(4.2是我的版本)在优化时更糟糕还是我需要提供额外的标志?
第三次(!)和最终编辑
我可以通过确保在编译时提供g ++优化标志-O
来报告我实现了相当的性能。经常发生的令人讨厌的事情之一
A:我在问题x上撕掉我的头发
B:你确定你没有做过吗?
答:这很有效,为什么这些信息并没有遍布整个地方以及网上问题x的每个教程?
B:你读过手册了吗?
答:不,如果我完全阅读了我用过的每一段代码/程序的手册,我就永远无法做任何事情......
咩。