2016-12-23 27 views
-4

什麼是C/C++代碼精確基準測試的推薦方法/庫?有些東西可以克服簡單測量執行時間的不準確性,即CPU頻率和系統負載可能在執行時間內發生變化。不確定計數執行的指令是否是正確的方法,因爲我的代碼中的瓶頸將(可能)成爲內存訪問。簡單但準確的C/C++代碼基準

+0

什麼是C/C++代碼? –

+0

@LightnessRacesinOrbit google it – fhucho

+0

好吧,現在我知道了,謝謝 –

回答

3

GNU概要文件gprof是對signle線程代碼進行性能測量的傳統方法。您不必手動測試代碼,只需在構建期間向gcc添加選項即可。

+0

當你使用-p(gprof enable)編譯的庫時,gprof無法使用,因此庫函數在基準測試中可能無法準確計數 –

+0

@ e.jahandar是的,只有頂級函數調用圖書館將進行基準測試。但是如果你沒有lib的源代碼,你通常也不關心低級函數。實際上,系統調用和多線程會帶來更多麻煩。 –

0

你所問的幾乎是不可能的。

因爲在現代處理器上,由於緩存和虛擬內存的影響,執行時間非常不確定。另外,一些操作的週期數取決於參數的特定值。

這意味着靜態基準測試(僅查看源代碼)無法準確,您無法避免運行該程序。然後,運行時間將從一次執行到下一次波動。

即使平均分幾次運行也是不準確的,因爲第二次和下一次執行會受到第一次執行的影響,並且不會再處於實際的狀態。

實際上,「運行時間」不再存在。

+0

沒有用戶輸入的程序的運行時間(我的情況)可以用概率的方式來定義。給定*環境*(執行前的系統狀態,輸入事件流),運行時間近似確定。所以運行時間可以定義爲預期的運行時間,假定從合適的分佈中選擇一個隨機的環境。 – fhucho

+0

簡單基準測試的問題在於我們不知道測量執行時間的改進是否是不同環境或修改程序的結果。平均有助於但僅在一定程度上。我在尋找的是最小化隨機環境(如CPU頻率)的影響。 – fhucho

+0

CPU頻率是完全非隨機的唯一參數! –

-1

在clock()上使用tick和tock,並且通過將函數包裝在for循環中運行至少十分之一秒。這消除了大部分緩存效果。然而,你可以做的一點是,你不一定想要消除緩存,因爲當用於真實時,函數將在部分緩存的上下文中運行。很難回答那個問題。

3

如果您使用的是X86,您可以嘗試使用英特爾V-Tune Amplifier,它爲您提供了C或C++應用程序的深微體系結構分析。它使用CPU內置的性能計數器來測量執行時間,還可以編號緩存未命中和大量的微架構級別信息。

+0

其他程序可以使用相同的硬件性能計數器。例如在Linux上,'perf stat。/ myprogram'將會測量整個程序的一組默認計數器。 –