scala与Java性能对比

来源:互联网 发布:调度数据网一二平面 编辑:程序博客网 时间:2024/06/08 03:24

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);114scala>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)101scala>  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)28scala>  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效率低下的问题。

0 0
原创粉丝点击