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 nich

Teraz 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.

questionAnswers(2)

yourAnswerToTheQuestion