一個有趣的java性能測試

早上看到兩個文章,關於性能測試的一些爭論的。

http://www.mkyong.com/java/while-loop-for-loop-and-iterator-performance-test-java/

http://stuq.nl/weblog/2009-01-28/why-many-java-performance-tests-are-wrong

在那個例子的結論中,說明iterator是最慢的。根據我的理解,iterator因爲做了一些額外的comodification判斷,所以應該是性能最差的。

而在後一篇文章中,卻反駁了這個結論。

覺得好玩,就拿來自己做了個實驗。結果發現了更好玩的事情。

一、測試過程

實驗代碼如下:

試驗方法:分別註釋掉其他兩個循環部分,每次單獨運行一種循環,每種循環方式運行三次,記錄其結果。

試驗記錄:

For:

297, 312, 297

Loop:

297, 296, 297

Iterator:

437, 454, 453

是不是很有趣?

而且,我將三個合在一起計算,也得出了相同的結論,無論iterator放在前面還是後面。

爲什麼在第二篇文章中說,將iterator放到最後計算就能獲得和前兩種方式差不多的性能?按照第二篇文章的說法,這與JVM有關,JVM需要進行“Warm up”,那麼我們換一個JVM是不是就會有不同呢?

於是,採用-server JVM重新運行,哈,結果真的不同了。

結果變成:For:172, Loop: 156, Iterator: 172

二、試驗所得

看以看到,相同的機器,採用不同的JVM,其性能差異還是很大的。(-server jvm加載啓動慢,但運行速度快,-client加載啓動快,但運行慢)

關於不同jvm的性能問題,請參考官方網站:http://java.sun.com/docs/hotspot/HotSpotFAQ.html

此外,還發現windows xp下jvm最多能使用的內存大概在1200M左右(-Xmx1200m),而linux,能在2400m左右,可能這也是很多服務器要選擇用linux的原因。(沒試windows server)

不管怎麼說,上面的第二篇文章還是給我們一些比較有價值的內容,比如做性能測試時的一些準則:

1、退出其他應用,用一個乾淨的環境運行被測試代碼;

2、多次測試取平均值;

3、關注內存和服務器的使用狀況;

4、關注外部系統的依賴和線程鎖等問題。

發佈了112 篇原創文章 · 獲贊 10 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章