我最近開始使用ClojureScript。當我重寫了ClojureScript的JavaScript程序時,我擔心ClojureScript的性能。如何提高ClojureScript性能
ClojureScript代碼
(def NUM 10000)
(def data
(vec (repeatedly NUM #(hash-map :x (rand) :y (rand)))))
(.time js/console "cljs")
(loop [x 0 y 0 d data]
(if (empty? d)
[x y]
(recur (+ x (:x (first d)))
(+ y (:y (first d)))
(rest d))))
(.timeEnd js/console "cljs")
編譯的JavaScript代碼(優化:空格)
benchmark_cljs.benchmark.NUM = 1E4;
benchmark_cljs.benchmark.data = cljs.core.vec.call(null, cljs.core.repeatedly.call(null, benchmark_cljs.benchmark.NUM, function() {
return cljs.core.PersistentHashMap.fromArrays.call(null, [new cljs.core.Keyword(null, "x", "x", 1013904362), new cljs.core.Keyword(null , "y", "y", 1013904363)], [cljs.core.rand.call(null), cljs.core.rand.call(null)]);
}));
console.time("cljs");
var x_4753 = 0;
var y_4754 = 0;
var d_4755 = benchmark_cljs.benchmark.data;
while (true) {
if (cljs.core.empty_QMARK_.call(null, d_4755)) {
new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [x_4753, y_4754], null);
} else {
var G__4756 = x_4753 + (new cljs.core.Keyword(null, "x", "x", 1013904362)).cljs$core$IFn$_invoke$arity$1(cljs.core.first.call(null, d _4755));
var G__4757 = y_4754 + (new cljs.core.Keyword(null, "y", "y", 1013904363)).cljs$core$IFn$_invoke$arity$1(cljs.core.first.call(null, d _4755));
var G__4758 = cljs.core.rest.call(null, d_4755);
x_4753 = G__4756;
y_4754 = G__4757;
d_4755 = G__4758;
continue;
}
break;
}
console.timeEnd("cljs");
JavaScript代碼
var NUM = 10000;
var data = [];
for (var i = 0; i < NUM; i++) {
data[i] = {
x: Math.random(),
y: Math.random()
}
}
console.time('js');
var x = 0;
var y = 0;
for (var i = 0; i < data.length; i++) {
x += data[i].x;
y += data[i].y;
}
console.timeEnd('js');
ClojureScript代碼和JavaScrpt代碼的功能相同,但每個處理時間都不相同。
處理時間
ClojureScript(optimizations :whitespace): 30 〜 70ms
ClojureScript(optimizations :advanced): 9 〜 13ms
JavaScript: 0.3ms 〜 0.9ms
請告訴我如何提高ClojureScript的處理時間。
在此先感謝。
那麼您可以通過ClojureScript產生的編譯的JavaScript輸出? – elclanrs
我添加了編譯好的JavaScript代碼。 – snufkon
由於Clojure的本地數據結構是不可變這是錯誤的說法JS和ClJS都在做同樣的事情。這些是兩種不同的語言,即使ClJS被編譯爲JS。 – yonki