http://www.cnblogs.com/superjt/archive/2012/04/22/2465348.html
Stephen Colebourne(近日发表了文章Is Scala the new EJB2?)对这封邮件做了点评,其要点总结如下:
- 作为一门语言,Scala中有很多颇具见地的想法。但它是门非常复杂的语言。
- 除了Scala所引入的概念与具体实现外,要想编写地道的Scala还有一个文化的问题,有时突然就蹦出来一个最佳实践:完全不管不顾社区。
- 我当然知道学习(以及教授)Scala的困难程度与重要性。因为我们不可能在没人学习Scala的情况下找到人,这个事实非常重要。
- 构建工具链导致开发很不舒服。这主要是因为SBT导致了Maven与Ant的边缘化——而他们是Java生态圈中的两个主要的构建工具。
- 每个主要的Scala发布都不兼容于之前的版本,这导致Scala开发者总是在开发新的库并重新发明轮子。
- 借助于分析与检查字节码,我们可以通过采用一些简单的规则实现100倍的改进:
- 不要使用for循环
- 不要使用scala.collection.mutable
- 不要使用scala.collection.immutable
- 总是使用private[this]
- 不要使用闭包
- 我和开发团队讨论了这个问题(迁回至Java),并且演示了两个代码基,结果是大家普遍同意进行切换。毫无疑问,我们肯定对Scala的某些方面还不太熟悉,但这不足以让我们还固守在Scala上。
其中一些问题可能不太重要(比如说,一门语言越流行,那么雇佣的开发者的经验就会越多),其中一些是根据经验来测试的。比如说,其中一条建议就是不要使用for循环。这可以通过如下代码进行测试:
scala> var start = System.currentTimeMillis(); var total = 0;for(i <- 0 until 100000) { total += i }; var end = System.currentTimeMillis(); println(end-start); println(total); 114 scala> scala< var start = System.currentTimeMillis(); var total = 0;var i=0;while(i < 100000) { i=i+1;total += i }; var end = System.currentTimeMillis(); println(end-start); println(total); 8
这里使用for循环(与"until"模式,很多Scala程序员都习惯这么用)要比对应的while循环慢很多,虽然使用while循环的可读性差一些。同样循环的Java实现对于for和while来说都是2ms。
我们做的另一个测试是通过从一个包含Integer对象的数据集合中加载来看看可变map的性能(这可以在Java与Scala中进行对比,装箱的损耗应该差不多)。
scala> val m = new scala.collection.mutable.HashMap[Int,Int]; var i = 0; var start = System.currentTimeMillis(); while(i<100000) { i=i+1;m.put(i,i);}; var end = System.currentTimeMillis(); println(end-start); println(m.size) 101 scala> val m = new java.util.HashMap[Int,Int]; var i = 0; var start = System.currentTimeMillis(); while(i<100000) { i=i+1;m.put(i,i);}; var end = System.currentTimeMillis(); println(end-start); println(m.size) 28 scala> val m = new java.util.concurrent.ConcurrentHashMap[Int,Int]; var i = 0; var start = System.currentTimeMillis(); while(i<100000) { i=i+1;m.put(i,i);}; var end = System.currentTimeMillis(); println(end-start); println(m.size) 55
完成一个相同算法,用Java的时间代价在30ms左右,而用Scala写却在300ms左右。然后发现Scala代码中有过多的for循环,将for循环改成while后,发现Scala程度花费时间大概在190ms之间。验证了while循环比for循环的高效。现在还在分析验证其他原因导致Scala效率低下的问题。