C++、g++和LLVM-Clang编译器性能分析

13

请注意,我的问题不是:如何告诉编译器启用编译时分析。

我想要对编译过程进行分析。对于每个文件,我想知道程序的每一行代码执行所需的时间。

我正在处理一个项目,其中一些文件需要很长时间来编译,我正在尝试找出原因。

是否可以使用g++或llvm-clang来实现这一点?

“-v -ftime-report”的输出(代表什么意思)?

在下列语句中,“parser”或“expand”使用了模板(templates)吗?

Execution times (seconds)
  callgraph construction:   0.06 ( 2%) usr   0.00 ( 0%) sys   0.09 ( 2%) wall    3181 kB ( 1%) ggc
  callgraph optimization:   0.05 ( 2%) usr   0.00 ( 0%) sys   0.05 ( 1%) wall    5243 kB ( 2%) ggc
  cfg cleanup           :   0.02 ( 1%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall      11 kB ( 0%) ggc
  df live regs          :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall       0 kB ( 0%) ggc
  df reg dead/unused notes:   0.03 ( 1%) usr   0.00 ( 0%) sys   0.03 ( 1%) wall    1993 kB ( 1%) ggc
  register information  :   0.04 ( 1%) usr   0.00 ( 0%) sys   0.04 ( 1%) wall       0 kB ( 0%) ggc
  alias analysis        :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall     450 kB ( 0%) ggc
  rebuild jump labels   :   0.03 ( 1%) usr   0.00 ( 0%) sys   0.03 ( 1%) wall       0 kB ( 0%) ggc
  preprocessing         :   0.12 ( 4%) usr   0.06 (12%) sys   1.46 (27%) wall    2752 kB ( 1%) ggc
  parser                :   0.67 (21%) usr   0.15 (29%) sys   0.89 (16%) wall   91749 kB (36%) ggc
  name lookup           :   0.15 ( 5%) usr   0.12 (24%) sys   0.24 ( 4%) wall   14384 kB ( 6%) ggc
  inline heuristics     :   0.03 ( 1%) usr   0.00 ( 0%) sys   0.03 ( 1%) wall       0 kB ( 0%) ggc
  tree gimplify         :   0.06 ( 2%) usr   0.01 ( 2%) sys   0.09 ( 2%) wall   15992 kB ( 6%) ggc
  tree eh               :   0.02 ( 1%) usr   0.01 ( 2%) sys   0.03 ( 1%) wall    4405 kB ( 2%) ggc
  tree CFG construction :   0.01 ( 0%) usr   0.01 ( 2%) sys   0.03 ( 1%) wall    6636 kB ( 3%) ggc
  tree CFG cleanup      :   0.02 ( 1%) usr   0.01 ( 2%) sys   0.02 ( 0%) wall      15 kB ( 0%) ggc
  tree find ref. vars   :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1870 kB ( 1%) ggc
  tree SSA rewrite      :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall    2357 kB ( 1%) ggc
  tree SSA other        :   0.00 ( 0%) usr   0.01 ( 2%) sys   0.00 ( 0%) wall      37 kB ( 0%) ggc
  tree operand scan     :   0.01 ( 0%) usr   0.04 ( 8%) sys   0.06 ( 1%) wall    6340 kB ( 2%) ggc
  tree SSA to normal    :   0.05 ( 2%) usr   0.00 ( 0%) sys   0.05 ( 1%) wall      95 kB ( 0%) ggc
  dominance computation :   0.04 ( 1%) usr   0.00 ( 0%) sys   0.04 ( 1%) wall       0 kB ( 0%) ggc
  expand                :   0.60 (18%) usr   0.03 ( 6%) sys   0.71 (13%) wall   45557 kB (18%) ggc
  varconst              :   0.02 ( 1%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall    3532 kB ( 1%) ggc
  jump                  :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1745 kB ( 1%) ggc
  mode switching        :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall       0 kB ( 0%) ggc
  integrated RA         :   0.35 (11%) usr   0.00 ( 0%) sys   0.35 ( 6%) wall    5259 kB ( 2%) ggc
  reload                :   0.29 ( 9%) usr   0.01 ( 2%) sys   0.31 ( 6%) wall    6490 kB ( 3%) ggc
  thread pro- & epilogue:   0.10 ( 3%) usr   0.01 ( 2%) sys   0.13 ( 2%) wall    4832 kB ( 2%) ggc
  final                 :   0.19 ( 6%) usr   0.01 ( 2%) sys   0.21 ( 4%) wall    2985 kB ( 1%) ggc
  symout                :   0.25 ( 8%) usr   0.01 ( 2%) sys   0.26 ( 5%) wall   27322 kB (11%) ggc
  TOTAL                 :   3.25             0.51             5.49             256741 kB

这是你能得到的最好结果。虽然不可能看到每个C++行的时间,但在这里,你可以看到问题是否出现在预处理器、解析器或任何其他编译器步骤中。你的文件仅编译了3.25秒。 - bitc
从这个短暂的运行时间中,你无法得出任何有意义的结论!累积所有编译的时间! - Frank Puck
2个回答

6

尝试使用g++的这些命令行选项:

-v -ftime-report

这将为您提供有关编译过程的更多信息。罪魁祸首通常是模板。


作为最后的手段,您可以注释掉一些内容以找出哪些是占用时间最多的。 - bitc

2

针对预处理线程时间过长的建议:

" 0.12 ( 4%) usr 0.06 (12%) sys 1.46 (27%) wall " - 这一行表示,在CPU上进行了小规模的预处理工作(0.12),但使用了相当多的系统调用(0.06或用户CPU时间的50%),并且大部分时间都浪费在等待I/O操作或繁忙系统上的CPU等待上(1.46实际时间 >> 0.18秒的CPU时间)。这个程序是机器上唯一运行的程序吗?

对于I/O,您可以:将noatime添加到文件系统中以减少I/O请求次数,购买更快的HDD(以更低的寻道时间或更高的IO速率为标准),将clang源移动到SSD甚至RAM驱动器(循环设备)。由于它是linux,所以无法进行碎片整理。

有关每个传递的含义,请使用http://gcc.gnu.org/onlinedocs/gccint/Passes.html#Passes


有关行的含义:gcc简介http://www.cse.iitb.ac.in/~uday/gcc-mini-workshop/gcc-internals-1.pdf RTL演示文稿http://www.cse.iitb.ac.in/grc/gcc-workshop-09/downloads/gccw09-rtl.pdf - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接