2012-07-05 96 views
6

我有一个大量使用模板的项目。最近编译时间突然上升。我想知道是否有办法查看哪些类/线需要最多时间由g ++编译。gcc明白编译时间在哪里

这里是-ftime报告

Execution times (seconds) 
TOTAL     : 0.30    0.05    0.37    9119 kB 

Execution times (seconds) 
garbage collection : 0.91 (6%) usr 0.00 (0%) sys 0.92 (5%) wall  0 kB (0%) ggc 
callgraph construction: 0.23 (2%) usr 0.11 (3%) sys 0.37 (2%) wall 10652 kB (1%) ggc 
callgraph optimization: 0.18 (1%) usr 0.12 (3%) sys 0.28 (2%) wall 11906 kB (2%) ggc 
varpool construction : 0.04 (0%) usr 0.01 (0%) sys 0.08 (0%) wall 6984 kB (1%) ggc 
cfg construction  : 0.03 (0%) usr 0.00 (0%) sys 0.05 (0%) wall  644 kB (0%) ggc 
cfg cleanup   : 0.05 (0%) usr 0.02 (0%) sys 0.05 (0%) wall  7 kB (0%) ggc 
trivially dead code : 0.05 (0%) usr 0.01 (0%) sys 0.12 (1%) wall  0 kB (0%) ggc 
df scan insns   : 0.37 (3%) usr 0.03 (1%) sys 0.43 (2%) wall  677 kB (0%) ggc 
df live regs   : 0.07 (0%) usr 0.01 (0%) sys 0.02 (0%) wall  0 kB (0%) ggc 
df reg dead/unused notes: 0.08 (1%) usr 0.01 (0%) sys 0.08 (0%) wall 2755 kB (0%) ggc 
register information : 0.05 (0%) usr 0.01 (0%) sys 0.05 (0%) wall  0 kB (0%) ggc 
alias analysis  : 0.01 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  878 kB (0%) ggc 
rebuild jump labels : 0.03 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
preprocessing   : 0.19 (1%) usr 0.44 (11%) sys 0.68 (4%) wall 5284 kB (1%) ggc 
parser    : 3.94 (28%) usr 1.43 (35%) sys 4.94 (27%) wall 355964 kB (48%) ggc 
name lookup   : 1.35 (9%) usr 0.88 (21%) sys 2.76 (15%) wall 64919 kB (9%) ggc 
inline heuristics  : 0.14 (1%) usr 0.03 (1%) sys 0.14 (1%) wall  0 kB (0%) ggc 
integration   : 0.02 (0%) usr 0.00 (0%) sys 0.02 (0%) wall  20 kB (0%) ggc 
tree gimplify   : 0.31 (2%) usr 0.07 (2%) sys 0.28 (2%) wall 24598 kB (3%) ggc 
tree eh    : 0.07 (0%) usr 0.02 (0%) sys 0.11 (1%) wall 7267 kB (1%) ggc 
tree CFG construction : 0.04 (0%) usr 0.04 (1%) sys 0.11 (1%) wall 15754 kB (2%) ggc 
tree CFG cleanup  : 0.12 (1%) usr 0.00 (0%) sys 0.05 (0%) wall  3 kB (0%) ggc 
tree find ref. vars : 0.03 (0%) usr 0.01 (0%) sys 0.02 (0%) wall  963 kB (0%) ggc 
tree PHI insertion : 0.00 (0%) usr 0.01 (0%) sys 0.01 (0%) wall  351 kB (0%) ggc 
tree SSA rewrite  : 0.03 (0%) usr 0.01 (0%) sys 0.01 (0%) wall 4078 kB (1%) ggc 
tree SSA other  : 0.03 (0%) usr 0.06 (1%) sys 0.12 (1%) wall 1504 kB (0%) ggc 
tree operand scan  : 0.04 (0%) usr 0.02 (0%) sys 0.08 (0%) wall 10781 kB (1%) ggc 
dominance computation : 0.15 (1%) usr 0.04 (1%) sys 0.15 (1%) wall  0 kB (0%) ggc 
out of ssa   : 0.09 (1%) usr 0.00 (0%) sys 0.02 (0%) wall  0 kB (0%) ggc 
expand vars   : 0.03 (0%) usr 0.00 (0%) sys 0.03 (0%) wall 1840 kB (0%) ggc 
expand    : 0.45 (3%) usr 0.04 (1%) sys 0.59 (3%) wall 37695 kB (5%) ggc 
post expand cleanups : 0.08 (1%) usr 0.02 (0%) sys 0.06 (0%) wall 4542 kB (1%) ggc 
varconst    : 0.15 (1%) usr 0.03 (1%) sys 0.12 (1%) wall 3595 kB (0%) ggc 
jump     : 0.01 (0%) usr 0.00 (0%) sys 0.04 (0%) wall 1904 kB (0%) ggc 
mode switching  : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
integrated RA   : 1.33 (9%) usr 0.09 (2%) sys 1.49 (8%) wall 18163 kB (2%) ggc 
reload    : 0.60 (4%) usr 0.10 (2%) sys 0.62 (3%) wall 8668 kB (1%) ggc 
thread pro- & epilogue: 0.17 (1%) usr 0.00 (0%) sys 0.20 (1%) wall 11884 kB (2%) ggc 
reg stack    : 0.02 (0%) usr 0.00 (0%) sys 0.00 (0%) wall  0 kB (0%) ggc 
final     : 0.71 (5%) usr 0.10 (2%) sys 0.84 (5%) wall 6251 kB (1%) ggc 
symout    : 1.10 (8%) usr 0.16 (4%) sys 1.19 (6%) wall 100954 kB (14%) ggc 
uninit var analysis : 0.03 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
early local passes : 0.00 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
rest of compilation : 0.49 (3%) usr 0.06 (1%) sys 0.76 (4%) wall 19252 kB (3%) ggc 
unaccounted todo  : 0.43 (3%) usr 0.09 (2%) sys 0.55 (3%) wall  0 kB (0%) ggc 
TOTAL     : 14.26    4.11   18.52    742072 kB 
+0

你需要提供更多的信息。我们很难在没有任何东西的情况下提供帮助。 – Mysticial

+1

您可以尝试编译不同的修订版本,并查看发生时间增加的时间;然后看看该版本中发生了哪些变化,希望能给你一些见解。 – mparizeau

+0

这可能是值得看看这个线程 http://stackoverflow.com/questions/2072454/how-do-i-find-out-why-g-takes-a-very-long-time -on-a-particular-file –

回答

8

Steven Watanabe模板分析器可以帮助您获得每个类/函数实例计数。 请参阅Debugging GCC Compile Times以获取此工具的实际链接。

+0

谢谢,这真的好像我在找什么! –

+1

除了没有关于如何使用它的文档。 – xaxxon

1

AFAIK一些输出,没有这样的编译开关确实存在。

更为人工的方法可以是预处理和编译(gcc -E,然后gcc -c上的预处理文件)之间进行拆分,以猜测何时花费时间。

另一种解决方案是测试您的构建环境,以便每个文件具有编译时间。请注意,我只能建议设置持续集成以便及早跟踪此类演变(一旦弹出,您就可以在不需要挖掘过去引入跳转的情况下对其进行检测)。

作为一个经验法则,你可以检查只有相关的报头包含(尝试删除一些),或者可以切换到预编译的头,

+0

非常感谢。 我已经对编译时间最长的文件有了一个概念。正如你指出的那样,这些文件包含了大部分头文件。 我试过预编译头文件,但得到的速度并没有如此高的提高(仍然不明白为什么)。只有ccache给我速度提高 –

+0

与-Q我得到的是,大部分时间都花在解析器上。但我不知道这可能意味着代码的可疑性。 –

+0

使用'/ usr/bin/gcc'在Mac OS X上存在“-ftime-report”选项 - “i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2335.15.00)'。更完整的报告似乎来自'/ usr/bin/clang' - 'Apple clang 2.1版(tags/Apple/clang-163.7.1)(基于LLVM 3.0svn)'。它可能是'clang'的一个选项,或者它可能只是GCC更新版本中的一个选项。 –

3

当我看到你已经在你的项目做大量使用的模板,我的第一个怀疑是模板实例,看到以下信息后,我的怀疑越来越强烈:

parser  : ... (27%) wall 355964 kB (48%) ggc 
name lookup : ... (15%) wall 64919 kB (9%) ggc 

既然不能看到代码(如你还没贴吧),所以我只能怀疑。我的第二个疑虑是,你还没有使用明确实例化的模板为类型(你肯定会使用),而不是你依靠实例您正在使用的模板,从大量的.cpp文件。如果是的话,那么这可能是主要问题,因为隐含实例化原因相同要实例化的模板许多次,每个翻译单元一次。因此,如果您有M模板,并且您使用的是N翻译单元(.cpp),那么将会有M * N实例化,而不仅仅是M实例化。

+1

中看到的内容非常感谢。情况就是这样,许多.cpp文件中实例化了相同的模板类。我会尝试找出需要最多时间的模板类,并对其进行修改。 –