我有一個ClojureScript程序,主要對集合進行數學計算。它是在慣用的,主機獨立的Clojure中開發的,所以很容易對它進行基準測試。令我驚訝的是(與Which is faster, Clojure or ClojureScript (and why)?的答案相反),ClojureScript中的相同代碼的運行速度比Clojure等效的要慢5-10倍。提高ClojureScript程序的性能
這是我做的。我打開了一個lein repl
和一個瀏覽器代碼http://clojurescript.net/。然後我在這兩個REPL中嘗試了這些片段。
(time (dotimes [x 1000000] (+ 2 8)))
(let [coll (list 1 2 3)] (time (dotimes [x 1000000] (first coll))))
然後我在瀏覽器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();
}
回到瀏覽器REPL:
(defn multiply [] (* 42 1.2))
然後嘗試兩個本地JavaScript乘法和它的clojurescript變體在javascript控制檯中,
benchmark(1000000, cljs.user.multiply);
benchmark(1000000, function(){ 42 * 1.2 });
我發現
- 本地JavaScript數學Clojure中相當於數學
- ClojureScript是比二者都慢5-10倍
現在的問題是,如何我可以提高ClojureScript程序的性能嗎?
有一些方法到目前爲止,我認爲
- 回落到使用可變JavaScript數組和幕後的對象。 (這可能嗎?)
- 回到使用原生javascript數學運算符。 (這是可能的呢?)
- 使用JavaScript陣列明確地
(aget js/v 0)
- 使用不那麼雄心勃勃實施的Clojure換的JavaScript,像https://github.com/chlorinejs/chlorine或https://github.com/gozala/wisp他們產生更地道的JavaScript,但他們不支持命名空間我正在使用很多。
我以爲你在ClojureScript的某個地方有譜定律! +1。 – 2013-05-14 20:45:43