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
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