使用g ++编译时,为什么以下程序减慢15%?

ojb*_*ass 3 c c++ performance

更新:为我的编译请求提供服务的编译框的实际解析结果不同.在较慢的实例中,我运行的是在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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个已知的问题?15%非常重要.并且全面了解真实,系统和用户时间.我必须等到明天发布会.

更新:我只试过我的一个编译框.我正在使用SuSE 10.

Joh*_*n T 7

使用gcc和g ++编译时,我看到的唯一区别是在前4行内.

GCC:

    .file   "loops.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
.globl _main
Run Code Online (Sandbox Code Playgroud)

克++:

    .file   "loops.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
    .align 2
.globl _main
Run Code Online (Sandbox Code Playgroud)

你可以看到唯一的区别是,使用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
Run Code Online (Sandbox Code Playgroud)

克++:

john@awesome:~$ time ./loopsGPP

real    0m22.111s
user    0m21.817s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)

我将最内部的迭代次数减少到1200次.结果并不像我希望的那样广泛,但是再次在Windows上生成程序集输出,并在Linux中完成计时.也许在MinGW的幕后做的事情与用于Linux对齐的gcc不同.