rog*_*ack 11 performance scala clojure
请参阅http://shootout.alioth.debian.org/u32q/compare.php?lang=clojure Clojure比java -server慢得多,而scala则不然.
是什么赋予了?
mik*_*era 11
您可以用任何语言编写快速或慢速代码:-)
基于对一些Clojure代码的快速检查,我想说性能差异的主要原因是Clojure基准代码尚未完全优化以使用可用的最快语言功能.
例如,Clojure中的以下功能都非常酷且对于开发方便有用,但会产生一些运行时性能开销:
如果你想要绝对的最大性能(以一些额外的复杂性为代价),你会想要重写代码以避免这些并使用如下的东西:
通过明智地使用上述内容,我发现在Clojure 1.2+中通常可以非常接近Java性能,例如考虑以下代码来做一百万次添加:
未经优化的Clojure使用惰性序列和biginterger算法.这很好用,但功能不是很快:
(reduce
(fn [acc val] (unchecked-int (unchecked-add (int acc) (int val))))
(range 0 1000000))
=> "Elapsed time: 65.201243 msecs"
Run Code Online (Sandbox Code Playgroud)
使用原始算法和循环/重复进行优化的Clojure:
(loop [acc (int 0) i (int 0)]
(if (>= i (int 1000000))
acc
(recur (unchecked-add acc i) (unchecked-inc i)) ))
=> "Elapsed time: 0.691474 msecs"
Run Code Online (Sandbox Code Playgroud)
Java代码,一个非常标准的迭代循环:
public static int addMillion() {
int result=0;
for (int i=0; i<1000000; i++) {
result+=i;
}
return result;
}
=> "Elapsed time: 0.692081 msecs"
Run Code Online (Sandbox Code Playgroud)
ps我在Clojure代码中使用了unchecked-add而不是+,以便它匹配Java的整数溢出行为.