2011-08-24 30 views
5

我們有很多GNU Make-files。我想在編譯期間使用每個目標,以確定任何性能瓶頸。是否有一種工具或技術以方便和自動的方式進行此操作?如何分析GNU Make文件的性能

我可能會喜歡解析這些結果,以便隨着構建更改和增長(但它已經非常龐大和複雜)來保持性能因子的選項卡。

回答

4

我想我以前在這裏看到了這個問題...

您可以替換的東西,調用一個外殼,但倍執行,並將結果與​​目標名稱某處一起寫入外殼。每個目標只會構建一次(或者拒絕運行),所以你只需要把時間加在一起。

非常粗糙例如:更換

make 

make SHELL='echo [email protected]: && time sh' 

如果你不想時間加起來,你還必須爲每一個目標的命令以某種方式加入到一個單一的命令。一種方法是通過預處理Makefile,但出於各種原因,對於除最簡單的Makefiles之外的任何其他方法都不適用。

例如嘗試像

perl -0pe 's/([^:])\s*\n\t[@-]?/$1; /g' Makefile | make -f - SHELL='echo [email protected]: && time sh' 

是在這個方向非常粗暴的刺傷。

有各種各樣的替代方法,但我認爲唯一真正的解決方案是添加此功能, GNU make是用非常便攜的C編寫的,所以不應該很難做到。

+0

'SHELL' ...聰明 –

1

在盒子外面思考:你是否偶然地使用遞歸使浪費了珍貴的電子,即規則cd到子目錄並再次調用make?那就是你的問題。非遞歸式製作可以更快兩個數量級。

詳見Recursive make considered harmful

0

下面將幫助您瞭解每個命令是如何運行的,因爲用錯的變量多少次:,:=

make SHELL='/bin/sh -x' 
0

如果你試圖剖析靜態Makefile,看看化妝探查:

https://github.com/gojuno/make-profiler

它的行爲就像一個圍繞make的封裝,它預處理Makefile,收集日誌並繪製帶時序信息的調用圖。如果您正在製作長時間運行的數據處理管道,這一點尤其有用。