J'ai une carte simple:ClojureScript carte recherche lente
(def my-map
{[1 2 3] 1
[1 2 4] 5
[3 4 2] 3
[4 5 3] 3
[5 2 5] 6
[9 2 1] 5
[8 3 1] 6})
que j'utilise pour effectuer des recherches. Cela joue assez mal, cependant:
(time (doseq [x (range 500)]
(my-map [1 2 8])))
"Elapsed time: 170 msecs"
Sur la même machine, Clojure peut faire 500 000 à environ 236 msec, soit environ 700x plus rapide. Bien qu'il ne soit pas surprenant que Clojure soit plus rapide que ClojureScript, je ne comprends pas pourquoi ClojureScript serait tellement plus lent.
Des idées sur la façon dont je pourrais faire une carte de recherche multi-valuée simple comme ci-dessus de manière efficace et d'une manière lisible dans ClojureScript? Je sais que faire un tas de if
s au lieu d'utiliser une solution de clé vectorielle fonctionnerait certainement plus rapidement, mais je regarde quelque chose qui est un peu plus lisible/maintenable.
Juste pour mettre à jour avec plus d'informations. Ce qui précède a été fait dans Firefox, donc plus lent que par rapport à V8. Ce qui suit:
(def my-map2
(into cljs.core.PersistentHashMap/EMPTY
{[1 2 3] 1
[1 2 4] 5
[3 4 2] 3
[4 5 3] 3
[5 2 5] 6
[9 2 1] 5
[8 3 1] 6}))
(defn p1 []
(let [v [1 2 8]]
(dotimes [_ 5]
(time (dotimes [_ 500000]
(get my-map2 v))))))
donne:
"Elapsed time: 3295 msecs"
"Elapsed time: 3246 msecs"
"Elapsed time: 3113 msecs"
"Elapsed time: 3107 msecs"
"Elapsed time: 3121 msecs"
en chrome Version 25.0.1364.160 Ubuntu 13.04 (25.0.1364.160-0ubuntu3). Donc encore environ 13 fois plus lent dans ClojureScript que Clojure, mais c'est beaucoup mieux que ce qu'il était auparavant. Notez également que je cours cela directement dans le navigateur repl.
Oui Firefox est un peu moins performant en termes de performances ClojureScript. J'espère que nous soumettrons bientôt un code de référence à Mozilla pour aider à résoudre ce problème. Le code JavaScript généré par le navigateur REPL n'est pas entièrement optimisé car cela entrave le développement. Donc, pour vraiment mesurer les performances de ClojureScript, vous devez utiliser une compilation avancée. – dnolen