2010-10-29 36 views
0

我想對使用Java,C++和Python編寫的基本相同算法的多個實現進行比較,後者在Mac OS X 10.6.4上使用Pypy,Jython和CPython執行帶有普通(非SSD)HDD的Macbook Pro。執行無偏差的程序/腳本性能比較

這是一個「解碼來自文件的數據流」類型的算法,其中相關的測量是總執行時間,並且我希望通過例如防止偏差。操作系統硬盤緩存,其他程序同時運行,太大/小樣本文件等。我需要注意什麼來創建一個公平的比較?

+0

void只是沒有偏見,我們其他人都有偏見 – 2010-10-29 15:13:07

+0

閱讀「統計嚴謹的Java性能評估」http://buytaert.net/statistically-rigorous-java-performance-evaluation並使用提供的JavaStats Python腳本http:// www.elis.ugent.be/JavaStats – igouy 2012-06-17 17:25:32

回答

0

我會建議您只需運行每個程序多次(如20左右),並採取每組最低的測量。這將使得程序很可能會使用高清緩存和其他類似的東西。如果他們都這樣做,那麼它就沒有偏見。

+0

*最低*度量可能是異常值嗎?我目前正在運行速度最快的程序,直到性能降至最低,以確保儘可能緩存所有內容,然後運行每次實現5次並取平均值。 – 2010-10-29 15:27:01

+0

確定它可能是一個異常值,但我認爲它可能不是。如果你認爲是這種情況,那麼你可以使用聚類算法來確定事物趨向於「聚集」的時間。 – 2010-10-30 17:53:32

+0

你的方法似乎是最實用的,結果看起來不錯。一旦HDD /文件緩存完成,就會非常接近。謝謝! – 2010-11-01 13:18:11

0

爲了防止偏見,我建議先停止所有不必要的進程在後臺運行。

我不知道有關Windows,但在Linux下你可以通過drop_caches清除硬盤緩存 如何使用它here

此外,你可能要採取平均的幾個運行信息應用程序,這種方式任何硬盤或操作系統的干擾不會扭曲結果。

+0

我在Mac OS X 10.6.4上(我確實意識到這可能不是最好的測試平臺,但這是我目前所擁有的) – 2010-10-29 15:27:43

1

這些都很難做好。

在很多情況下,操作系統會緩存文件,所以第二次執行它們時,它們會突然變得更好。

另一個問題是你比較解釋語言和編譯。解釋型語言需要將解釋器加載到內存中或者不能運行。要嚴格公平,你應該考慮內存使用和解釋器的加載時間是否應該成爲測試的一部分。如果您在可以假設解釋器總是預加載的環境中尋找性能,那麼您可以忽略它。許多Web服務器的設置將能夠保持解釋器的預裝。如果您在桌面上執行臨時客戶端應用程序,那麼在解釋器加載時啓動可能會非常緩慢。

+0

程序相當短(< 50行),並且我已經看到Python在不到0.01秒的時間內就會返回非常短的腳本。由於這些文件相當大(400+ MB)並按字節順序解碼,所以這可能不會成爲太大的問題。 – 2010-10-29 15:23:47

0

爲了完全不偏不倚是不可能的,你可以做各種各樣的東西,比如運行最小進程等等,但是IMO最好的方法是在不同的日子裏以很長的時間隨機地運行腳本並獲得平均值,儘可能地禁用。

因爲最終代碼將以隨機順序在這樣的環境中運行,並且您對平均行爲感興趣的不是某些數字。

+0

如果我的數字由(看到我的命令埃文的答案)非常接近(最快和最慢執行之間的差異<1%) - 你認爲這仍然適用?我不想在機器忙於其他事情時測試HDD尋道時間,我想確定技術對算法的影響。 – 2010-10-29 15:29:53

+0

<1%,我想測試沒有意義,除非你有非常特殊和簡約的硬件,現代操作系統和電腦,我認爲它足夠複雜以至於擊敗你的目的 – 2010-10-30 05:05:24

+0

對不起,我的意思是,同一個實現的多次執行都非常接近一起。例如,C++比Python快幾倍。這就是我的意思是隨機性等。 – 2010-10-30 13:42:16