scala 是不是比 java 更快,因为两者都在 JVM 上运行? [复制]
Posted
技术标签:
【中文标题】scala 是不是比 java 更快,因为两者都在 JVM 上运行? [复制]【英文标题】:Is scala is faster that java since both runs on JVM? [duplicate]scala 是否比 java 更快,因为两者都在 JVM 上运行? [复制] 【发布时间】:2015-10-09 12:09:47 【问题描述】:在我研究过的许多网站中,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()
输出 耗时: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();
输出 耗时:30 毫秒,元素数量:30000
【问题讨论】:
我不是说哪个更快,但是对于有意义的测试,您可以尝试使用for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM.
openjdk.java.net/projects/code-tools/jmh 的 java micro benchmark 测试
“scala 比 java 快”——这对于任何类型的程序来说都不是真的。此外,由于 JIT 优化等原因,在 JVM 上编写正确的微基准测试比像您正在做的那样编写循环要困难得多。请参阅How do I write a correct micro-benchmark in Java?
不要被无意义的基准分数吓倒:看到比较代码是件好事。目前:Scala 有可能对其函数式编程数据结构和算法(即不可变数据)进行更好的优化。但是 java 可能在更接近 JVM(=uglier?)方面处于领先地位,更多的人力资源已经处理了代码。
做一个正确的基准测试。我已将您的 Scala 代码移动到一个函数中,连续调用 4 次,结果为耗时:283 毫秒,元素数:30000 耗时:34 毫秒,元素数:30000 耗时:17 毫秒,元素:30000 耗时:3 毫秒,元素数量:30000
作为副本关闭:尽管检查的代码不同,但这两个问题都缺乏适当的基准测试,Shipilev 的最佳答案是一个很好的例子,即“Scala 比 Java 快/慢”的问题是多么有争议。还要关注relevant post 和他的博客整体
【参考方案1】:
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 编译器生成的“字节码”之间不太可能存在真正的性能差异。
如果您想深入了解这一点,只需使用 Class File Disassembler 分析字节码(即 Java 或 Scala 编译器生成的 .class 文件)
javap -c YourClass.class【讨论】:
以上是关于scala 是不是比 java 更快,因为两者都在 JVM 上运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章