【问题标题】:Why does g++ take much longer to compile <algorithm> with -std=c++11?为什么 g++ 用 -std=c++11 编译 <algorithm> 需要更长的时间?
【发布时间】:2017-12-29 22:38:43
【问题描述】:

g++ 版本为 5.3.0。

#include <algorithm>
int main() {
    return 0;
}

test$ time g++ test.cpp

real    0m0.203s
user    0m0.073s
sys     0m0.031s

test$ time g++ test.cpp --std=c++11

real    0m0.761s
user    0m0.554s
sys     0m0.130s

多次尝试的结果相似。仅包含矢量标头的小幅减速(0.03s)。

【问题讨论】:

  • 如果解析器速度较慢......或者字节码的创建会很有趣。
  • 不知道为什么你会期望结果是相似的,tbh。除了解析 C++11 代码的额外复杂性之外,C++11 中的算法库中还添加了许多函数(参见:en.cppreference.com/w/cpp/algorithm)。
  • 在 Ubuntu 17.04 上使用 g++ 6.3.0,我尝试了 g++ -E -std=c++NN c.cpp 用于 NN = 98、11、14、17。(这会将预处理的输出转储到标准输出。)输出为 9255、15746、分别为 16198 和 16245 行。这解释了一些差异,但不一定是幅度。
  • 使用g++ 6.3.0,我看不出编译时间有很大差异。

标签: c++11 g++ stl-algorithm


【解决方案1】:

直截了当的答案是显然还有更多需要编译。使用-Q -ftime-report GCC 将打印出配置文件统计信息。请记住,左侧的部分不可靠,因为每次运行命令时它都会更改,但 TOTAL 始终是一致的。分别针对 C++03 和 C++11:

Execution times (seconds)
 phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1189 kB (16%) ggc
 phase parsing           :   0.03 (100%) usr   0.02 (100%) sys   0.06 (100%) wall    6301 kB (83%) ggc
 preprocessing           :   0.01 (33%) usr   0.01 (50%) sys   0.04 (67%) wall     488 kB ( 6%) ggc
 parser (global)         :   0.00 ( 0%) usr   0.01 (50%) sys   0.00 ( 0%) wall    3626 kB (48%) ggc
 parser struct body      :   0.02 (67%) usr   0.00 ( 0%) sys   0.01 (17%) wall     778 kB (10%) ggc
 parser function body    :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 (17%) wall     436 kB ( 6%) ggc
 TOTAL                 :   0.03             0.02             0.06               7558 kB

Execution times (seconds)
 phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1384 kB (11%) ggc
 phase parsing           :   0.05 (100%) usr   0.03 (100%) sys   0.10 (100%) wall   10953 kB (88%) ggc
 |name lookup            :   0.00 ( 0%) usr   0.01 (33%) sys   0.01 (10%) wall    1301 kB (10%) ggc
 preprocessing           :   0.01 (20%) usr   0.00 ( 0%) sys   0.03 (30%) wall     878 kB ( 7%) ggc
 parser (global)         :   0.01 (20%) usr   0.01 (33%) sys   0.01 (10%) wall    4592 kB (37%) ggc
 parser struct body      :   0.02 (40%) usr   0.00 ( 0%) sys   0.01 (10%) wall    2837 kB (23%) ggc
 parser function body    :   0.01 (20%) usr   0.01 (33%) sys   0.01 (10%) wall     478 kB ( 4%) ggc
 parser inl. meth. body  :   0.00 ( 0%) usr   0.01 (33%) sys   0.03 (30%) wall     937 kB ( 8%) ggc
 symout                  :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 (10%) wall       0 kB ( 0%) ggc
 TOTAL                 :   0.05             0.03             0.10              12490 kB

这是12490 - 7558 = 4942 KB 的区别,并没有那么大的区别。至于为什么GCC 5.3.0 有这么大的差异,这是一个 QoI 问题,可能在以后的版本中得到了修复。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多