scala是否比java更快,因为两者都在JVM上运行?

scala是否比java更快,因为两者都在JVM上运行?,java,scala,functional-programming,Java,Scala,Functional Programming,在许多网站上,我研究过scala比Java更快。我已经编写了代码来测试这两者之间的时间差,但是Scala需要更多的时间。我不知道我是否犯了什么错误。如果我错了,请纠正我 Scala代码 package com.first import java.util.ArrayList object Word extends App{ val absoluteResult = new ArrayList[Any]() val before = System.currentTimeMillis()

在许多网站上,我研究过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()
    }
}
package.com.first
导入java.util.ArrayList
对象词扩展应用程序{
val absoluteResult=新阵列列表[任何]()
val before=System.currentTimeMillis()
变量i=0
while(i“String”
大小写:布尔=>“布尔”
大小写:整数=>“整数”
case=>抛出新的IllegalArgumentException()
}
}
输出 拍摄时间: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();
      }
}
}
package.com.first;
导入java.util.ArrayList;
导入java.util.HashSet;
导入java.util.List;
导入java.util.Set;
公共类快速排序{
公共静态void main(字符串[]args){
List absoluteResult=新建ArrayList();
很久以前=System.currentTimeMillis();
对于(int i=0;i<10000;i++){
列表结果=新建ArrayList();
结果。添加(“foo”);
结果.增加(23);
结果。添加(true);
用于(对象y:结果){
绝对结果。添加(foo(y));
}
}
System.out.println(“take:”+(System.currentTimeMillis()-before)
+ms,元素数:“+absoluteResult.size());
}
静态字符串foo(对象s){
如果是字符串的实例{
返回“字符串”;
}else if(s布尔实例){
返回“布尔”;
}else if(s instanceof Integer){
返回“整数”;
}否则{
抛出新的IllegalArgumentException();
}
}
}
输出
拍摄时间:30毫秒,元素数:30000个Scala不比Java快(Java也不比Scala快)

您的“基准测试”质量很差,您应该使用JMH()或类似工具来进行微基准测试。主要原因是为了消除死代码并预热代码。请参阅和

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

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

javap -c YourClass.class javap-c YourClass.class
我不是说哪一个更快,但对于有意义的测试,您可以尝试java微基准测试,它用于构建、运行和分析用java和其他针对JVM的语言编写的nano/micro/milli/macro基准测试。“scala比java快”-对于任何类型的程序来说,这通常都是不正确的。此外,由于JIT优化等原因,在JVM上编写正确的微基准比只编写一个循环要困难得多。请参阅不要被没有意义的基准分数所吓倒:看到比较代码是件好事。目前,Scala有可能做得更好r针对其函数式编程数据结构和算法(即不可变数据)进行了优化。但java可能在更接近JVM(=更丑?)方面领先一步,更多的人力资源已经处理了代码。做一个正确的基准测试。我已经将您的Scala代码移动到一个函数,连续调用了4次,结果是:283毫秒,元素数:30000毫秒,34毫秒,元素数:30000毫秒,17毫秒,元素数:30000毫秒,3毫秒,元素数:30000毫秒,作为副本关闭:尽管被检查的代码不同,但这两个问题都缺乏适当的基准测试,Shipilev的顶级答案就是一个很好的例子,说明“Scala比Java快/慢”问题是多么有争议。另外,请注意a和他的博客