Mam program ClojureScript, który wykonuje głównie obliczenia matematyczne w kolekcjach. Został opracowany w idiomatycznym, niezależnym od hosta Clojure, więc łatwo go porównać. Ku mojemu zaskoczeniu (i wbrew temu, co sugerowałyby odpowiedzi na Which is faster, Clojure or ClojureScript (and why)?), ten sam kod w ClojureScript działa 5-10 razy wolniej niż jego odpowiednik Clojure.Zwiększenie wydajności programu ClojureScript
Oto co zrobiłem. Otworzyłem wersję lein repl
i przeglądarkę pod numerem http://clojurescript.net/. Następnie wypróbowałem te fragmenty w obu REPL.
(time (dotimes [x 1000000] (+ 2 8)))
(let [coll (list 1 2 3)] (time (dotimes [x 1000000] (first coll))))
Potem otworzył konsolę JavaScript w repl przeglądarki i napisał minimalistyczny funkcję benchmarkiem
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 rodzimej JavaScript mnożenie i jego wariant clojurescript w konsoli javascript,
benchmark(1000000, cljs.user.multiply);
benchmark(1000000, function(){ 42 * 1.2 });
Co znalazłem
- Native javascript matematyki jest porównywalna z matematyki w Clojure
- ClojureScript jest 5-10 razy wolniej niż którekolwiek z nich
Teraz moje pytanie, w jaki sposób mogę poprawić wydajność mojego programu ClojureScript?
Istnieje kilka metod, jakie uważane dotychczas
- spaść do korzystania zmienne tablic i obiektów za kulisami javascript. (Czy to w ogóle możliwe?)
- Powrót do korzystania z macierzystych operatorów matematycznych javascript. (Czy to w ogóle możliwe?)
- użycie javascript tablice wyraźnie z
(aget js/v 0)
- użyć mniej ambitną realizację Clojure-for-javascript, jak https://github.com/chlorinejs/chlorine lub https://github.com/gozala/wisp generują one więcej idiomatyczne JavaScript, ale nie obsługują nazw którego używam bardzo.
Myślałem, że masz gdzieś normę widmową w ClojureScript! +1 do tego. –