找回密码
 注册
查看: 10561|回复: 54

同样的程序在Linux和Windows下速度差别如此之大?

[复制链接]
发表于 2005-11-21 14:36:38 | 显示全部楼层 |阅读模式
写了一个小程序,是用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;
}
发表于 2005-11-21 15:43:57 | 显示全部楼层
很奇怪,不知道,在我的机器上跑了102s,没有windows,也没有VC6,没有测windows的
回复

使用道具 举报

发表于 2005-11-21 16:21:22 | 显示全部楼层
老大 那是编译器的问题 怎么把责任都推给LINUX 如果你把相同的汇编语言分别测试一下 看看情况怎么样
回复

使用道具 举报

 楼主| 发表于 2005-11-21 16:36:39 | 显示全部楼层
我也知道是编译器的问题啊!我用的是FC4自带的gcc4.0
可是没有理由啊!gcc不是最好的C编译器吗?
难道是编译参数问题?我加了-O3还是同样的结果
回复

使用道具 举报

发表于 2005-11-21 17:11:53 | 显示全部楼层
我用cygwin试了一下,效果跟linux下基本一样,说明的确是编译去问题。。。。。。。太打击了吧,gcc跟微软的编译器就差那么远?郁闷。
回复

使用道具 举报

发表于 2005-11-21 17:31:44 | 显示全部楼层
不过也有可能跟rand()函数有关系。
回复

使用道具 举报

发表于 2005-11-21 17:37:44 | 显示全部楼层
我在同事的机器上测了一下,我们机器配置基本一致,windows下跑了55s,基本比linux下快了一半,尤其奇怪,得出的结果也不完全一样,也许跟数学库有一定关系。
回复

使用道具 举报

 楼主| 发表于 2005-11-21 17:54:09 | 显示全部楼层
[quote:7af67f63b6="marship"]我在同事的机器上测了一下,我们机器配置基本一致,windows下跑了55s,基本比linux下快了一半,尤其奇怪,得出的结果也不完全一样,也许跟数学库有一定关系。[/quote]

结果有小的不一样是正常的,因为用到了随机数嘛。那个sigma就是误差范围。
回复

使用道具 举报

发表于 2005-11-21 18:48:58 | 显示全部楼层
建议有条件的用INTEL的编译器试试,应该就不会有太大的差别了吧
回复

使用道具 举报

发表于 2005-11-23 16:02:01 | 显示全部楼层
我用intel编译器试了一下,结果跟gcc没有差别,应该是rand()函数的实现不一样。
回复

使用道具 举报

发表于 2005-11-24 00:07:32 | 显示全部楼层
已经被证实了VC的程序执行速度很快,难道你没发现VC编译后的可执行文件很大吗?
回复

使用道具 举报

发表于 2005-11-24 10:44:32 | 显示全部楼层
Visual C++的确是很强大的。你知道吗,WinDVD就坚持用Visual C++编译所有的底层函数库,比如视频解码、音频解码等程序,这些都是标准C和汇编程序,而不仅仅在软件界面才使用Visual C++进行编译。
回复

使用道具 举报

发表于 2005-11-25 20:14:14 | 显示全部楼层
用time测一下?
回复

使用道具 举报

发表于 2005-11-26 15:41:07 | 显示全部楼层
有点打击... 难道不是优化参数的问题.?
回复

使用道具 举报

发表于 2005-11-27 19:46:44 | 显示全部楼层
我在同一台机器上用不同的编译器编译了楼主的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时间就少了。这么以降低用户进程性能来换取系统的稳定到底值不值得?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-6 09:53 , Processed in 0.037018 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表