scala是否比java在JVM上运行更快?

Gow*_* SB 2 java functional-programming scala

在许多网站中,我研究过scala比Java更快.我编写了代码来测试这两者之间的时差,但Scala需要更多时间.我不知道我是否犯了任何错误.如果我错了,请纠正我.

Scala代码

package com.first

import java.util.ArrayList

object Word extends App{
  val absoluteResult = new ArrayList[Any]()
  val before = System.currentTimeMillis()
  var i =0
  while (i<10000) {
    i = i+1
    val result = List("foo", 23, true).iterator
    while (result.hasNext) {
      absoluteResult.add(foo(result.next))
    }
  }
  println("Took : "+(System.currentTimeMillis() - before)
      +" ms, number of elements : "+absoluteResult.size)

  def foo(obj : Any) =
    obj match {
          case _:String => "String"
          case _:Boolean => "Boolean"
          case _:Integer => "Integer"
          case _ => throw new IllegalArgumentException()
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:142毫秒,元素数量:30000

Java代码

package com.first;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class quicksort {
    public static void main(String[] args) {
        List<Object> absoluteResult = new ArrayList<Object>();
        long before = System.currentTimeMillis();
        for (int i=0; i < 10000; i++) {
          List<Object> result = new ArrayList<Object>();
          result.add("foo");
          result.add( 23);
          result.add(true);
          for (Object y : result) {
            absoluteResult.add(foo(y));
          }
        }
        System.out.println("Took : "+(System.currentTimeMillis() - before)
          +" ms, number of elements : "+absoluteResult.size());
      }


    static String foo(Object s) {
      if (s instanceof String) {
        return "String";
      } else if (s instanceof Boolean) {
        return "Boolean";
      } else if (s instanceof Integer) {
        return "Integer";
      } else {
        throw new IllegalArgumentException();
      }
}
}
Run Code Online (Sandbox Code Playgroud)

输出:30毫秒,元素数量:30000

sal*_*lyh 9

Scala并不比Java快(Java也不比Scala快).

你的"基准"质量很差,你应该使用JMH(http://openjdk.java.net/projects/code-tools/jmh/)或类似的方法做微基准测试.主要原因是消除死代码并预热代码.请参阅http://java-performance.info/jmh/http://www.oracle.com/technetwork/articles/java/architect-benchmarking-2266277.html

Java中的优化不是由编译器完成的,而是由JVM(例如Hotspot)完成的.因此,Scala/Java或Clojure编译器生成的"字节码"之间存在真正的性能差异是不太可能的.

如果你想深入研究这个,只需使用类文件反汇编程序分析字节码(即Java或Scala编译器生成的.class文件).

javap -c YourClass.class