gpt4 book ai didi

ClojureScript map 查找缓慢

转载 作者:行者123 更新时间:2023-12-03 22:07:31 25 4
gpt4 key购买 nike

我有一个简单的 map :

(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 中运行它。

最佳答案

在我的机器上运行您的确切示例并使用高级编译在我的 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 在定义具有复杂键的小型散列映射时不会这样做。

如果我们像这样定义 my-map 会发生什么:
(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]))

然后基准测试需要大约 170 毫秒,这与 Clojure JVM 相差不远。

因此,Clojure 实现了很多我们还没有实现的优化。我仍然会说,对于惯用的 Clojure 代码,我认为我们在像 V8 这样高度调整的 JavaScript 引擎上所能期望的最好的结果是 Clojure JVM 的 2-10 倍。

关于ClojureScript map 查找缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16641250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com