更新:为我的编译请求服务的编译框的实际解析是不同的。在较慢的实例中,我运行的是在SuSE 9上编译的代码,但运行的是SuSE 10框。这就足以让我放下它,拿苹果和苹果做比较。在使用相同的编译框时,结果如下:
g++大约慢了百分之二
达美实际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。
发布于 2009-04-09 03:03:30
当使用gcc和g++编译时,我看到的唯一不同是前4行。
gcc:
.file "loops.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _maing++:
.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.004sg++:
john@awesome:~$ time ./loopsGPP
real 0m22.111s
user 0m21.817s
sys 0m0.000s我将最内部的迭代减少到1200次。结果并不像我所希望的那样普遍,但是程序集输出是在windows上生成的,并且是在Linux中完成的。也许在MinGW的幕后所做的事情与gcc在Linux对齐方面所做的不一样。
发布于 2009-04-09 02:52:40
为了弄清楚为什么速度较慢,您可能需要查看编译器生成的程序集。g++编译器一定在执行与gcc编译器不同的操作。
发布于 2009-04-09 03:03:54
原因之一是gcc可能优化了m和n的分配,使它们可以并行运行。
可以这样做的
m = i+j+k;
n = i+j+k+2; 我不确定这比提高了15%的表现。这可能会提高多核CPU的性能。最好的方法是比较两个编译器的汇编代码。
https://stackoverflow.com/questions/732602
复制相似问题