主题:【原创】C++编译器的区别:ViscalC++ .VS. g++ -- 正宗鲁皮皮
最近翻出来研究生时写的一个项目,用C++写的,用来处理GPS中频数据的,说白了是一个软件GPS接收机,中频采样率是16.34MHz, 总共是40秒的数据,一个数据采样是一个字节, 所以总共有600M左右的数据量,(干过GPS接收机 的都知道为什么需要40秒的数据)。 原来的程序是在Linux下写的,用g++编译,核心的信号处理部分大概有20个源文件,编译後的可执行文件处理所有40秒的数据需要10分钟左右。 最近几个周末忙活了一阵,将核心的信号处理部分给移植到windows下了, 用VisualC++6.0的编译器编译的,因为原来的文件都是用标准的C++写的,所以基本没有做任何改动,只是加了两个文件做DLL的接口, 今天我用这个DLL写了一个应用程序,几乎和Linux下一样的功能,结果好家伙, 处理速度那叫一个慢,处理完全部的数据需要40分钟还多! 这个结果实在让我困惑: 几乎一样的源代码,一样的数据, 为什么Linux下要比windows下要快好几倍?
我不是编译器的专家,但我猜差别应该在编译器上。河里的大牛多,那位对此有研究的欢迎赐教。
(追加一点,两个版本都在同一台机器上运行的,windows版本是xp2, linux版本是RedHat的FC6, 运行结果也是一样的(处理的结果,包括解调的电文,通道跟踪环的状态,以及最后的定位信息)。
照理两个OS虽然不一样,但是下面的机器是一样的,应该差别不大。最简单的检查办法就是看优化开关是否都打开了。编译器优化还是很有用的。
如果还不行,就要用profiler看bottleneck在哪里了,通常是一个最核心的loop里面效率低,比如说cache miss多。4倍的速度差,看起来像是cache miss比较严重。
我已经好多年没有用VC写过程序了,对其设置一点都不熟,能不能详细讲讲如何检查编译器优化?
多谢了。
一个低级错误, 我编译DLL的时候用的是debug版本,现在改为realease版本,然后选maximim speed优化,运行速度就和linux下不相上下了。
多谢美人他爹, 这ID怎么这么怪泥?对了, 你真有一个女儿吗?
否则就要跳出来了:)
虽然这篇文章看上去挺有用的,但版规还是要遵守的。
而且当我找到贴出的时候,楼主还没有解决问题。我当时还在拼命的想啊,到底是什么问题?ui?多线程?dll?根本想不出来,所以就把这个文章找出来。没想到居然是这么简单的问题,哈! 还有前几天猛然发现你是版主,吓我一跳,略略有些担心不知道是否得罪过你,哈!
麻烦把全文帖子改一下。谢谢。
让我好好想想。。。好像没有
不用担心,大家上网能碰到一块儿,还能聊起来,挺不过容易的。要是我的言语曾有冲撞,也请你担待。
谢谢了。
最近几年一直在Linux下写code, 都不会用windows编程了。