我在linux上使用mingw32交叉編譯器構建了很多自動生成的代碼,其中包括一個特別大的文件(約15K行)。大多數文件非常快,但是這個大文件需要很長時間(約15分鐘)才能編譯。我如何知道爲什麼g ++在特定文件上花費很長時間?
我已經嘗試過操縱各種優化標誌,看看它們是否有任何效果,沒有任何運氣。我真正需要的是確定g ++在做什麼的一些方法,這需要花費很長時間。是否有任何(相對簡單的)方法讓g ++產生關於不同編譯階段的輸出,以幫助我縮小可能的掛斷?
不幸的是,我沒有能力重建這個交叉編譯器,因此向編譯器添加調試信息並逐步完成它並不是一種可能性。
什麼是文件:
- 一堆包括
- 一串字符串比較
- 一堆的if-then檢查和構造函數調用
該文件是的工廠生產某種父母類別的許多不同特定的子類。然而,大部分的內容都沒有什麼特別的花哨。
-ftime報告的結果,由尼爾·巴特沃思的建議,表明了「生命分析」階段正在921秒,它佔據了大部分15分鐘。
看起來這發生在數據流分析過程中。該文件本身就是一堆條件字符串比較,通過以字符串形式提供的類名稱構造一個對象。
我們認爲改變它以指向函數指針的名稱映射可能會改善一點,所以我們將嘗試這樣做。
實際上,產生一串工廠函數(每個對象),並從原有的15分鐘產生從對象的字符串名稱的地圖的指針其工廠功能降低編譯時至約25秒,這將爲他們節省大量的時間。
再次感謝尼爾巴特沃斯關於-ftime-report的提示。
看看這個:http://stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long – 2010-01-15 15:04:39
你能告訴我們什麼是在文件中?內聯函數?枚舉?定義?包括和宏列表?他們有多少人? – Coincoin 2010-01-15 15:18:49
如果使用本地編譯器,是否會遇到同樣的問題?如果是這樣,您可以重新啓動配置文件,查看時間花費在哪裏。 – 2010-01-15 15:33:06