Mejorar el rendimiento de un programa ClojureScript.

Tengo un programa ClojureScript que realiza principalmente cálculos matemáticos en colecciones. Fue desarrollado en Clojure idiomático e independiente del host, por lo que es fácil de comparar. Para mi sorpresa (y contrariamente a lo que las respuestas sugerirían¿Qué es más rápido, Clojure o ClojureScript (y por qué)?), el mismo código en ClojureScript se ejecuta de 5 a 10 veces más lento que su equivalente en Clojure.

Aquí esta lo que hice. Abrí unlein repl y una respuesta del navegador enhttp://clojurescript.net/. Luego probé estos fragmentos en ambos REPL.

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

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

Luego abrí una consola de javascript en el navegador y escribí una función de referencia minimalista,

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

Volver al navegador REPL:

 (defn multiply [] (* 42 1.2))

Luego intente la multiplicación nativa de javascript y su variante de código en la consola de javascript,

 benchmark(1000000, cljs.user.multiply);

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

Lo que encontré

Las matemáticas nativas de javascript son comparables a las matemáticas en clojureClojureScript es 5-10 veces más lento que cualquiera de ellos

Ahora mi pregunta es, ¿cómo puedo mejorar el rendimiento de mi programa ClojureScript?

Hay algunos enfoques que he considerado hasta ahora

Recurra al uso de matrices de javascript y objetos mutables entre bastidores. (¿Es esto posible en absoluto?)Recurra al uso de operadores matemáticos de JavaScript nativos. (¿Es esto posible en absoluto?)Utilice matrices de JavaScript explícitamente con(aget js/v 0)Use una implementación menos ambiciosa de clojure-for-javascript, comohttps://github.com/chlorinejs/chlorine ohttps://github.com/gozala/wisp Generan un javascript más idiomático, pero no admiten los espacios de nombres que estoy usando mucho.

Respuestas a la pregunta(2)

Su respuesta a la pregunta