今天在網絡上看到了一篇關於Scala和java多線程對比的文章《Simple Scala actor Vs java Thread Vs Kilim Test,原文連接:http://www.blogjava.net/BlueDavy/archive/2009/11/25/303662.html。》,乍看起來彷佛是證實了Scala在多核處理性能上要強於Java,但通過個人分析和測試,發現結果並不靠譜。html
這篇文章的做者知識面挺廣的,寫了3個版本的性能對比代碼,而且得出了Scala在多核處理性能上要強於Java。但我要說的是這篇文章所獲得的測試結果很不客觀,由於裏面所用的數據結構和算法有很大問題。java
問題一,1000次循環裏,竟然拿java裏面的ArrayList和Scala裏面的數組比對性能,這是很致命的失誤。從理論和實際狀況看,數組原本就比ArrayList性能強不少倍。算法
問題二,scala版本的1000次循環竟然使用性能很爛的for循環,而不是性能更好的while,真是無語呀。數組
問題三,1000次循環裏,java版本里很耗時的一個動做是 String.valueOf(i);看起來和Scala版本里面的i.toString類似,但實際上,這兩種語言裏面的內部實現是不一樣的。尤爲是java版本里面的String.valueOf(i),產生了過多的對象,性能並很差。爲了公平起見, java版本里把String.valueOf(i);直接用直接用字符串」1」替換,Scala版本里面也直接字符串」1」替換i.toString,測試結果是java版本和Scala版本所運行的時間是基本相同的。此外,更好玩的是,一旦把java裏面的ArrayList數據結構換成數組,測試的結果是java版本的運行時間比Scala版本要快一倍。網絡
今天爲這個測試折騰了半天時間,得出的結論是:在作各類語言性能對比的時候,必定要充分了解你所使用的數據結構和算法,必定要客觀評估本身所採用的算法和數據結構對測試結果的影響。不然,獲得結果極可能是南轅北轍。
數據結構