首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么下面的程序在用g++编译时会慢15%?

为什么下面的程序在用g++编译时会慢15%?
EN

Stack Overflow用户
提问于 2009-04-09 02:48:37
回答 4查看 609关注 0票数 3

更新:为我的编译请求服务的编译框的实际解析是不同的。在较慢的实例中,我运行的是在SuSE 9上编译的代码,但运行的是SuSE 10框。这就足以让我放下它,拿苹果和苹果做比较。在使用相同的编译框时,结果如下:

g++大约慢了百分之二

达美实际4分钟达美用户4分钟达美系统5秒

谢谢!

gcc v4.3 vs g++ v4.3简化为最简单的情况,只使用简单标志

代码语言:javascript
运行
复制
#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。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-09 03:03:30

当使用gcc和g++编译时,我看到的唯一不同是前4行。

gcc:

代码语言:javascript
运行
复制
    .file   "loops.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
.globl _main

g++:

代码语言:javascript
运行
复制
    .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:

代码语言:javascript
运行
复制
john@awesome:~$ time ./loopsC

real    0m21.212s
user    0m20.957s
sys 0m0.004s

g++:

代码语言:javascript
运行
复制
john@awesome:~$ time ./loopsGPP

real    0m22.111s
user    0m21.817s
sys 0m0.000s

我将最内部的迭代减少到1200次。结果并不像我所希望的那样普遍,但是程序集输出是在windows上生成的,并且是在Linux中完成的。也许在MinGW的幕后所做的事情与gcc在Linux对齐方面所做的不一样。

票数 7
EN

Stack Overflow用户

发布于 2009-04-09 02:52:40

为了弄清楚为什么速度较慢,您可能需要查看编译器生成的程序集。g++编译器一定在执行与gcc编译器不同的操作。

票数 2
EN

Stack Overflow用户

发布于 2009-04-09 03:03:54

原因之一是gcc可能优化了m和n的分配,使它们可以并行运行。

可以这样做的

代码语言:javascript
运行
复制
m = i+j+k;
n = i+j+k+2; 

我不确定这比提高了15%的表现。这可能会提高多核CPU的性能。最好的方法是比较两个编译器的汇编代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/732602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档