同样的程序在Linux和Windows下速度差别如此之大?
写了一个小程序,是用Monte Carlo算法算圆周率的。在VisualC++6.0 Release下跑500000000需要12秒。
在FC4下编译:
gcc aa.c -lm
然后执行,跑500000000却用了50多秒!
郁闷,是什么原因呢?难道Linux不如Windows吗?
附源程序:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "math.h"
int main(int argc, char* argv[])
{
double x,y,sigma,pi=0.0;
long end=1,i,time1,time2,count;
while(end)
{
count=0;
printf("\nPlease input uplimit of the rand numbers( 0 to stop ): ");
scanf("%ld",&end);
if(end<=0)
{
printf("Error: Wrong Uplimit!\n");
continue;
}
printf("Now is calculating the pi ...\n");
time1=time(NULL);
srand(time1);
for(i=0;i<end;i++)
{
x=(double)rand()/RAND_MAX;
y=(double)rand()/RAND_MAX;
if((x*x+y*y)<=1.0) count++;
}
pi=(count/(double)end)*4;
sigma=sqrt(pi*(pi-1)/(double)end);
time2=time(NULL);
printf("Pi = %f +- %f\t\tTime use: %d seconds\n",pi,sigma,time2-time1);
}
return 0;
} 很奇怪,不知道,在我的机器上跑了102s,没有windows,也没有VC6,没有测windows的 老大 那是编译器的问题 怎么把责任都推给LINUX 如果你把相同的汇编语言分别测试一下 看看情况怎么样 我也知道是编译器的问题啊!我用的是FC4自带的gcc4.0
可是没有理由啊!gcc不是最好的C编译器吗?
难道是编译参数问题?我加了-O3还是同样的结果 我用cygwin试了一下,效果跟linux下基本一样,说明的确是编译去问题。。。。。。。太打击了吧,gcc跟微软的编译器就差那么远?郁闷。 不过也有可能跟rand()函数有关系。 我在同事的机器上测了一下,我们机器配置基本一致,windows下跑了55s,基本比linux下快了一半,尤其奇怪,得出的结果也不完全一样,也许跟数学库有一定关系。 我在同事的机器上测了一下,我们机器配置基本一致,windows下跑了55s,基本比linux下快了一半,尤其奇怪,得出的结果也不完全一样,也许跟数学库有一定关系。
结果有小的不一样是正常的,因为用到了随机数嘛。那个sigma就是误差范围。 建议有条件的用INTEL的编译器试试,应该就不会有太大的差别了吧 我用intel编译器试了一下,结果跟gcc没有差别,应该是rand()函数的实现不一样。 已经被证实了VC的程序执行速度很快,难道你没发现VC编译后的可执行文件很大吗? Visual C++的确是很强大的。你知道吗,WinDVD就坚持用Visual C++编译所有的底层函数库,比如视频解码、音频解码等程序,这些都是标准C和汇编程序,而不仅仅在软件界面才使用Visual C++进行编译。 用time测一下? 有点打击... 难道不是优化参数的问题.? 我在同一台机器上用不同的编译器编译了楼主的PI程序,输入值为500000000时,运行情况(时间单位:秒)
如下表:
编译环境 默认选项编译速度优化选项 操作系统 备注
运行时间 编译运行时间
Dev-C++ 68 61 Windows2000 它是用gcc做编译器的
BC5.5 29 29 Windows2000 Borland的免费编译器
TC3.0 78 77 DOS7.0 Borland 92年的产品,16位
TC2.0 108 108 DOS7.0 Borland 88年的产品,16位
GCC 100 80 红旗Linux 5.0 核心版本是2.6.9
GCC编译出来的代码速度实在令人失望,居然只能跟TC系列勉强打个平手。不过GCC的速度优化确实还有点用。
还有个有意思的地方:同样是用GCC编译出来的代码,在Windows2000下和Linux下运行时间居然差了有50%!我猜这可能是Linux的核心进程占用了更多的CPU时间,分给用户进程的CPU时间就少了。这么以降低用户进程性能来换取系统的稳定到底值不值得?