Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ClojureScript映射查找速度慢_Clojure_Clojurescript - Fatal编程技术网

ClojureScript映射查找速度慢

ClojureScript映射查找速度慢,clojure,clojurescript,Clojure,Clojurescript,我有一张简单的地图: (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毫秒内完成

我有一张简单的地图:

(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毫秒内完成500000次,或者快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中直接运行此功能。

在我的机器上运行您的示例,在我的1.7ghz Macbook Air上运行从源代码构建的相对较新的v8,需要约14毫秒的时间

为了确保我们正在进行我们认为正在进行的基准测试,最好编写如下内容:

(let [v [1 2 8]]
  (dotimes [_ 5]
    (time
      (dotimes [_ 500000]
        (get my-map v)))))
在我的机器上,Clojure JVM需要约70毫秒的时间。ClojureScript的运行速度约为3600毫秒,因此大约慢50倍。为什么?这是因为我们默认使用PersistentArrayMap,而Clojure在使用复杂键定义小散列映射时不这样做

如果我们这样定义我的地图会发生什么:

(def my-map
  (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]))
然后,基准测试需要约170ms的时间,距离Clojure JVM不远


因此,Clojure实现了很多我们还没有考虑的优化。不过我还是要说,对于惯用的Clojure代码,我认为在高度调优的JavaScript引擎(如V8)上,我们所能期望的最好结果是Clojure JVM的2-10倍

谢谢德诺伦!请参阅更新,了解更多详细信息,以阐明差异。看起来我现在只需要切换到Chromium;)使用你的建议,在这里使用散列和数组-很高兴知道这一点。是的,Firefox在ClojureScript性能方面有点落后。希望我们将很快向Mozilla提交基准代码,以帮助解决这个问题。浏览器REPL生成的JavaScript代码没有得到充分优化,因为这会妨碍开发。因此,为了真正衡量ClojureScript的性能,您需要使用高级编译。