2011-05-04 67 views
3

我試圖做一個典型的「A/B測試」類似於兩種不同實現算法的實現,在這兩種情況下使用相同的數據集。該算法在執行方面是確定性的,所以我真的希望結果是可重複的。如何測量i7上的java性能?

在Core 2 Duo上,情況也是如此。只使用linux「time」命令,我會得到大約0.1%的執行時間變化(超過10次運行)。

在i7我會得到各種變化,我可以很容易有30%的變化上下平均。我認爲這是由於i7所做的各種CPU優化(動態超頻等),但它確實很難做這種測試。是否有其他方法可以確定2種算法中的哪種算法是「最好的」,我可以使用的任何其他合理的指標?

編輯:該算法不會持續很長時間,這實際上是我試圖進行基準測試的真實場景。所以重複跑並不是真正的選擇。

+0

是否可以禁用這些CPU優化?也許通過編譯一個定製的內核或設置一些/ proc標誌? – 2011-05-04 08:31:31

回答

3

看看您是否可以關閉BIOS中的動態超頻。此外,在執行基準測試時,請關閉所有可能的其他進程。

+0

哦,是的,我忘了一件事:如果您的基準測試不使用網絡通信,請在運行基準測試之前禁用您的網卡並重新啓動。 – Christo 2011-05-04 08:47:26

1

那麼你可以使用O-notation原則來確定算法的性能。這將決定算法的理論速度。

http://en.wikipedia.org/wiki/Big_O_notation

如果你絕對必須知道的算法FFT現實生活中的速度,然後OFC你必須標杆它的系統上。但是使用O-notation可以看到所有這些,只關注重要的因素/變量。

0

你沒有指出你如何進行基準測試。如果你還沒有閱讀,你可能需要閱讀:How do I write a correct micro-benchmark in Java?

如果你正在運行一個持續測試,我懷疑動態時鐘會導致你的變化。它應該保持在最高的渦輪速度。如果你運行時間太長,也許它會降低一倍乘熱量。雖然我懷疑這一點,除非你超頻並且接近熱量包絡。

超線程可能發揮作用。你可以在你的BIOS中禁用它,看看它是否會影響你的數字。

+0

這不是一個微基準。這是一個實時計算,但它不會持續太久。這就是我想要的基準 – krosenvold 2011-05-04 08:49:22

+0

也許動態時鐘正在影響你。這聽起來像你應該禁用它和超線程來排除它們。是否有任何理由不能重複你的計算(比如100x)以維持更長的時間以獲得更一致的結果? – WhiteFang34 2011-05-04 09:03:27

0

在linux上,您可以鎖定CPU速度以停止時鐘速度變化。 ;)

您需要使基準儘可能現實。例如,如果您運行一個算法並取平均值,那麼每10毫秒執行一次相同的任務可能會得到不同的結果。即,即使在鎖定時鐘速度的情況下,我已經看到了2倍到10倍的變化(在扁平輸出和相對低的負載之間)。