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

时间:2009-04-09 02:48:38

标签: 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;
}

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

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

4 个答案:

答案 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)