今天在网络上看到了一篇关于Scala和java多线程对比的文章《Simple Scala actor Vs java Thread Vs Kilim Test,原文链接:http://www.blogjava.net/BlueDavy/archive/2009/11/25/303662.html。》,乍看起来似乎是证明了Scala在多核处理性能上要强于Java,但经过我的分析和测试,发现结果并不靠谱。
这篇文章的作者知识面挺广的,写了3个版本的性能对比代码,并且得出了Scala在多核处理性能上要强于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版本要快一倍。
今天为这个测试折腾了半天时间,得出的结论是:在做各种语言性能对比的时候,一定要充分了解你所使用的数据结构和算法,一定要客观评估自己所采用的算法和数据结构对测试结果的影响。否则,得到结果很可能是南辕北辙。