Verbessern Sie die Leistung eines ClojureScript-Programms

Ich habe ein ClojureScript-Programm, das hauptsächlich mathematische Berechnungen für Sammlungen durchführt. Es wurde in idiomatischer, hostunabhängiger Clojure entwickelt, so dass es leicht zu bewerten ist. Zu meiner Überraschung (und entgegen dem, was die Antworten nahelegen würden)Was ist schneller, Clojure oder ClojureScript (und warum)?) läuft derselbe Code in ClojureScript 5-10 mal langsamer als sein Clojure-Äquivalent.

Hier ist was ich getan habe. Ich öffnete einlein repl und ein Browser-Antwort anhttp://clojurescript.net/. Dann habe ich diese Schnipsel in beiden REPLs ausprobiert.

 (time (dotimes [x 1000000] (+ 2 8)))

 (let [coll (list 1 2 3)] (time (dotimes [x 1000000] (first coll))))

Dann öffnete ich eine Javascript-Konsole im Browser und schrieb eine minimalistische Benchmark-Funktion,

 function benchmark(count, fun) {
   var t0 = new Date();
   for (i = 0; i < count; i++) {
     fun();
   }
   var t1 = new Date();
   return t1.getTime() - t0.getTime();
 }

Zurück zum Browser REPL:

 (defn multiply [] (* 42 1.2))

Versuchen Sie dann sowohl die native Javascript-Multiplikation als auch die Clojurescript-Variante in der Javascript-Konsole.

 benchmark(1000000, cljs.user.multiply);

 benchmark(1000000, function(){ 42 * 1.2 });

Was ich fand

Native Javascript-Mathematik ist vergleichbar mit Mathematik in ClojureClojureScript ist 5-10 mal langsamer als beide

Nun frage ich mich, wie ich die Leistung meines ClojureScript-Programms verbessern kann.

Es gibt einige Ansätze, über die ich bisher nachgedacht habe

Verwenden Sie hinter den Kulissen veränderbare JavaScript-Arrays und -Objekte. (Ist das überhaupt möglich?)Greifen Sie auf native Javascript-Mathematikoperatoren zurück. (Ist das überhaupt möglich?)Verwenden Sie Javascript-Arrays explizit mit(aget js/v 0)Verwenden Sie eine weniger ehrgeizige Implementierung von clojure-for-javascript wiehttps://github.com/chlorinejs/chlorine oderhttps://github.com/gozala/wisp Sie generieren ein idiomatischeres Javascript, aber sie unterstützen keine Namespaces, die ich häufig verwende.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage