2012-07-05 151 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文件中實例化了相同的模板類。我會嘗試找出需要最多時間的模板類,並對其進行修改。 –