我有一张简单的地图:
(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})
我用来执行查找的。然而,这表现相当糟糕:
(time (doseq [x (range 500)]
(my-map [1 2 8])))
"Elapsed time: 170 msecs"
在同一台机器上,Clojure 可以在大约 236 毫秒内完成 500,000 次,或者快 700 倍。虽然 Clojure 比 ClojureScript 快并不意外,但我很困惑为什么 ClojureScript 会慢得多。
关于如何在 ClojureScript 中高效且以可读方式制作简单的多值查找图的任何想法?我知道做一堆if
s 而不是使用矢量键解决方案肯定会更快,但我正在寻找更具可读性/可维护性的东西。
只是为了更新更多信息。以上是在 Firefox 中完成的,因此比 V8 慢。以下:
(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))))))
给出:
"Elapsed time: 3295 msecs"
"Elapsed time: 3246 msecs"
"Elapsed time: 3113 msecs"
"Elapsed time: 3107 msecs"
"Elapsed time: 3121 msecs"
在 Chromium 版本 25.0.1364.160 Ubuntu 13.04 (25.0.1364.160-0ubuntu3) 中。所以在 ClojureScript 中仍然比 Clojure 慢 13 倍,但这比以前要好得多。另请注意,我直接在浏览器 repl 中运行它。