早上看到兩個文章,關於性能測試的一些爭論的。
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、關注外部系統的依賴和線程鎖等問題。