已更新:为我的编译请求提供服务的编译框的实际解析结果不同。在较慢的实例中,我运行的是在SuSE 9上编译但在SuSE 10上运行的代码。这对我来说是足够的差异,并将苹果与苹果进行比较。使用相同的编译框时,结果如下:
g ++慢了2%
三角洲真正的4分钟 三角洲用户4分钟 三角洲系统5秒谢谢!
gcc v4.3 vs g ++ v4.3简化为最简单的情况只使用简单的标志
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int i=0;
int j=0;
int k=0;
int m=0;
int n=0;
for (i=0;i<1000;i++)
for (j=0;j<6000;j++)
for (k=0;k<12000;k++)
{
m = i+j+k;
n=(m+1+1);
}
return 0;
}
这是一个已知问题吗? 15%非常重要。并且全面了解真实,系统和用户时间。我必须等到明天发布会。
更新:我只试过我的一个编译框。我正在使用SuSE 10。
答案 0 :(得分:7)
使用gcc和g ++编译时,我看到的唯一区别是前4行。
GCC
.file "loops.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
克++:
.file "loops.c"
.def ___main; .scl 2; .type 32; .endef
.text
.align 2
.globl _main
正如您所看到的唯一区别在于,使用g ++时,对齐(2)出现在单词边界上。这种微小的差异似乎正在产生显着的性能差异。
这是一个解释结构对齐的页面,虽然它适用于ARM / NetWinder,它仍然适用,因为它讨论了对齐如何在现代CPU上工作。您将特别阅读第7节“单词对齐有哪些缺点?” :
http://netwinder.osuosl.org/users/b/brianbr/public_html/alignment.html
以下是.align操作的参考:
http://www.nersc.gov/vendor_docs/ibm/asm/align.htm
要求的基准:
GCC
john@awesome:~$ time ./loopsC
real 0m21.212s
user 0m20.957s
sys 0m0.004s
克++:
john@awesome:~$ time ./loopsGPP
real 0m22.111s
user 0m21.817s
sys 0m0.000s
我将最内部的迭代次数减少到1200次。结果并不像我希望的那样广泛,但是再次在Windows上生成程序集输出,并在Linux中完成计时。可能在MinGW的幕后做的事情与使用gcc进行Linux对齐的事情不同。
答案 1 :(得分:2)
为了弄清楚为什么它的速度较慢,您可能需要查看编译器生成的程序集。 g ++编译器必须做一些与gcc编译器不同的东西。
答案 2 :(得分:1)
其中一个原因是gcc可能已经优化了m和n的赋值,因此它们可以并行运行。
可以这样做
m = i+j+k;
n = i+j+k+2;
我不确定这比将性能提高15%。这可能会在多核CPU中提升一点性能。最好的方法是比较2个编译器的汇编代码。
答案 3 :(得分:0)
哦, 是一个有趣的。但是你给我们的代码不能编译。你需要
(int argc, char** argv)