我試圖分析一些功能,實現不同版本的相同的算法以不同的方式。我增加了每個函數的運行次數,以便在單個函數中花費的總時間大約爲1分鐘(以顯示性能差異)。獲取可靠的性能測量的短代碼位
現在,運行多次測試會產生莫名其妙的結果。在同一個函數的幾次執行之間存在巨大的變化(+ - 50%),並且因此確定哪個函數最快(這是測試的目標)幾乎是不可能的。
在運行測試之前,我是否應該照顧一些特殊的東西,以便測量更平滑?如果沒有,就是多次運行測試並計算每種功能的平均值。
我試圖分析一些功能,實現不同版本的相同的算法以不同的方式。我增加了每個函數的運行次數,以便在單個函數中花費的總時間大約爲1分鐘(以顯示性能差異)。獲取可靠的性能測量的短代碼位
現在,運行多次測試會產生莫名其妙的結果。在同一個函數的幾次執行之間存在巨大的變化(+ - 50%),並且因此確定哪個函數最快(這是測試的目標)幾乎是不可能的。
在運行測試之前,我是否應該照顧一些特殊的東西,以便測量更平滑?如果沒有,就是多次運行測試並計算每種功能的平均值。
有很多事情要檢查!
首先,確保你的函數實際上是CPU綁定的。如果是這樣,請確保在測試中禁用所有CPU節流,turbo模式和省電模式(在BIOS中)。如果您仍然遇到問題,請嘗試將您的進程固定到單個核心。可能也禁用超線程。
所有這些的目標是確保您的代碼在單個內核上運行時不會受到太多幹擾。如果你在Linux上,你可以從可用內核的操作系統列表中刪除單個內核,並使用它(所以不會對內核造成干擾)。
多次運行測試是個好主意,但使用平均值(算術平均值)不是。相反,請使用不受異常值影響的中值或最小值或其他度量值。通常,偶爾長時間的測試運行可能會被徹底拋出(除非你正在構建一個實時系統!)。
不錯!我正在記錄和搜索硬件資料。 – michaelmeyer 2014-09-04 12:25:49
你是如何測量時間的?你使用'glibc'庫來收集數據嗎?你使用'clock_t'和/或'tms'結構嗎?我研究了[測量時間的glibc手冊](http://www.gnu.org/software/libc/manual/html_mono/libc.html#Date-and-Time)以瞭解您的問題,並希望確保您知道CPU時間和處理器時間測量。 – Bhaskar 2014-09-04 12:48:32
@Bhaskar:我用'clock_t()'和'gettimeofday()'。不知道'tms',看着那個。 – michaelmeyer 2014-09-04 13:05:34
'gettimeofday()'給你日曆時間,並不是你想要的,IMO。日曆和處理器時間就是你要找的東西,儘管我並沒有完全理解它在多處理器設置中的差異。 – Bhaskar 2014-09-04 13:08:50