Popraw wydajność programu ClojureScript
Mam program ClojureScript, który głównie wykonuje obliczenia matematyczne na kolekcjach. Został on opracowany w idiomatycznym, niezależnym od hosta Clojure, więc łatwo go porównać. Ku mojemu zdziwieniu (i wbrew temu, co sugerowałyby odpowiedzi)Co jest szybsze, Clojure lub ClojureScript (i dlaczego)?), ten sam kod w ClojureScript działa 5-10 razy wolniej niż jego odpowiednik Clojure.
Oto co zrobiłem. Otworzyłem alein repl
i replikę przeglądarki nahttp://clojurescript.net/. Potem spróbowałem tych fragmentów na obu REPL.
(time (dotimes [x 1000000] (+ 2 8)))
(let [coll (list 1 2 3)] (time (dotimes [x 1000000] (first coll))))
Następnie otworzyłem konsolę javascript w replice przeglądarki i napisałem minimalistyczną funkcję testowania,
function benchmark(count, fun) {
var t0 = new Date();
for (i = 0; i < count; i++) {
fun();
}
var t1 = new Date();
return t1.getTime() - t0.getTime();
}
Powrót do przeglądarki REPL:
(defn multiply [] (* 42 1.2))
Następnie spróbuj zarówno natywnego mnożenia javascript, jak i jego wariantu clojurescript w konsoli javascript,
benchmark(1000000, cljs.user.multiply);
benchmark(1000000, function(){ 42 * 1.2 });
Co znalazłem
Natywna matematyka javascript jest porównywalna z matematyką w clojureClojureScript jest 5-10 razy wolniejszy niż którykolwiek z nichTeraz moje pytanie brzmi: jak mogę poprawić wydajność mojego programu ClojureScript?
Do tej pory rozważałem kilka podejść
Powróć do używania zmiennych tablic javascript i obiektów za kulisami. (Czy to w ogóle możliwe?)Powróć do używania natywnych operatorów matematyki javascript. (Czy to w ogóle możliwe?)Używaj jawnie tablic javascript(aget js/v 0)
Użyj mniej ambitnej implementacji clojure-for-javascript, jakhttps://github.com/chlorinejs/chlorine lubhttps://github.com/gozala/wisp Generują javascript bardziej idiomatyczny, ale nie obsługują przestrzeni nazw, których używam bardzo często.