scala是否比java更快,因为两者都在JVM上运行?
在许多网站上,我研究过scala比Java更快。我已经编写了代码来测试这两者之间的时间差,但是Scala需要更多的时间。我不知道我是否犯了什么错误。如果我错了,请纠正我 Scala代码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()
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和他的博客