Ada*_*deg 8 performance clojure clojurescript
我有一个ClojureScript程序,主要对集合执行数学计算.它是在惯用的,独立于主机的Clojure中开发的,因此很容易对它进行基准测试.令我惊讶的是(与答案建议哪个更快,Clojure或ClojureScript(以及为什么)?)相比,ClojureScript中的相同代码运行速度比Clojure等效慢5-10倍.
这就是我做的.我lein repl在http://clojurescript.net/上打开了一个浏览器代码.然后我在两个REPL中尝试了这些片段.
(time (dotimes [x 1000000] (+ 2 8)))
(let [coll (list 1 2 3)] (time (dotimes [x 1000000] (first coll))))
Run Code Online (Sandbox Code Playgroud)
然后我在浏览器repl上打开了一个javascript控制台并编写了一个简约的基准函数,
function benchmark(count, fun) {
var t0 = new Date();
for (i = 0; i < count; i++) {
fun();
}
var t1 = new Date();
return t1.getTime() - t0.getTime();
}
Run Code Online (Sandbox Code Playgroud)
返回浏览器REPL:
(defn multiply [] (* 42 1.2))
Run Code Online (Sandbox Code Playgroud)
然后在javascript控制台中尝试本机javascript乘法及其clojurescript变体,
benchmark(1000000, cljs.user.multiply);
benchmark(1000000, function(){ 42 * 1.2 });
Run Code Online (Sandbox Code Playgroud)
我找到了什么
现在我的问题是,如何提高ClojureScript程序的性能?
到目前为止我已经考虑过一些方法
(aget js/v 0)Mic*_*zyk 10
JavaScript有明确的回报,所以
function () { 42 * 1.2 }
Run Code Online (Sandbox Code Playgroud)
什么也没做; 你会想要基准
function () { return 42 * 1.2 }
Run Code Online (Sandbox Code Playgroud)
代替.这恰好是ClojureScript版本编译的内容,因此没有任何区别(在ClojureScript中,非高阶用法中的基本算术函数被内联为常规的基于运算符的JavaScript表达式).
现在,Clojure在这一点上肯定比ClojureScript更快.部分原因是Clojure仍然比ClojureScript更精心调整,尽管ClojureScript在这个部门的发展速度非常快.另一部分是Clojure有一个更成熟的JIT可以利用(现代的JS引擎,特别是V8,非常棒,但还不是很好的HotSpot级).
但是,衡量差异的程度有点棘手; JIT涉及的事实意味着一个没有任何副作用的主体的循环,例如问题中的一个循环,可能会被优化掉,甚至可能在第一次运行时(通过使用堆栈替换) ,由HotSpot使用,我认为也是V8 - 我必须检查以确定).所以,更好的基准测试
(def arr (long-array 1))
;;; benchmark this
(dotimes [_ 1000000]
(aset (longs arr) 0 (inc (aget (longs arr) 0))))
Run Code Online (Sandbox Code Playgroud)
(longs要求避免在Clojure中反思;也可以使用^longs提示).
最后,在Clojure和ClojureScript中,情况确实如此,对于某些特别对性能敏感的代码,最好使用本机数组等.令人高兴的是,有一个与这样做没有问题:在ClojureScript的一面,你有array,js-obj,aget,aset,make-array,你可以使用:mutable的字段元数据deftype能够为set!他们在方法体等.
ClojureScript数学是 JavaScript数学.是的,如果性能至关重要,请使用JavaScript数组和提供的低级运算符,这些运算符可以保证在可能的情况下生成最佳代码(即没有更高的订单使用率).ClojureScript持久数据结构以这种方式编写:数组变异,算术,比特翻转.
我有一个高效的ClojureScript的小例子 - http://github.com/swannodette/cljs-stl/blob/master/src/cljs_stl/spectral/demo.cljs,你可能会觉得它很有用.
| 归档时间: |
|
| 查看次数: |
1484 次 |
| 最近记录: |