今天在网络上看到了一篇关于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版本要快一倍。网络
今天为这个测试折腾了半天时间,得出的结论是:在作各类语言性能对比的时候,必定要充分了解你所使用的数据结构和算法,必定要客观评估本身所采用的算法和数据结构对测试结果的影响。不然,获得结果极可能是南辕北辙。
数据结构