2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面,了解更多有关如何在此工作的信息。

0
ClojureScript

在 CLJS 中,{{hash-ordered-coll}} 和 {{hash-unordered-coll}} 当前使用 {{seq}} 而不是迭代器来消耗它们的集合。大多数核心集合类型都有高效的 {{-iterator}} 实现,这可以避免 {{seq}} 的固有额外分配。

使用迭代器而不是 {{seq}},在大集合和更频繁的迭代中显示出适度的性能提升;基准运行器大小(1000)和重复次数(100)在我的机器上(搭载 "Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz" 的 Ubuntu 18.04)上没有明显的区别。

`
(ns cljs.benchmark-runner
(:refer-clojure :exclude [println]))

(def println print)

(set! print-fn js/print)

;; 注意,集合大小和重复次数都是基准运行器一般使用的10倍。
;; 10x what benchmark-runner usually uses.
(def hash-coll-test
(loop [i 0 r []]

(if (< i 10000)
  (recur (inc i) (conj r (str "foo" i)))
  r)))

(def hash-imap-test
(loop [i 0 r {}]

(if (< i 10000)
  (recur (inc i) (conj r [(keyword (str "foo" i)) i]))
  r)))

(def hash-imap-int-test
(loop [i 0 r {}]

(if (< i 10000)
  (recur (inc i) (conj r [i i]))
  r)))

`

`

在 Ubuntu 18.04 上使用 "Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz" 进行的基准运行

master 的基准结果

使用 V8 进行基准测试
[coll hash-coll-test], (hash-ordered-coll coll), 1000 次运行,1831 毫秒
[coll hash-imap-test], (hash-unordered-coll coll), 1000 次运行,6506 毫秒
[coll hash-imap-int-test], (hash-unordered-coll coll), 1000 次运行,8439 毫秒

添加此补丁后的基准结果

使用 V8 进行基准测试
[coll hash-coll-test], (hash-ordered-coll coll), 1000 次运行,1629 毫秒
[coll hash-imap-test], (hash-unordered-coll coll), 1000 次运行,5753 毫秒
[coll hash-imap-int-test], (hash-unordered-coll coll), 1000 次运行,6810 毫秒
`

3 个回答

0

评论者:mfikes

cljs-2931.patch LGTM.

它在 CI 和 Canary 上都通过了。

以下是扩展到覆盖所有 VM 的相同三个基准测试

`

        V8: 1.18, 1.46, 1.23

SpiderMonkey:1.05,0.94,0.93
JavaScriptCore:1.29,1.03,1.01

   Nashorn: 1.05, 1.31, 0.71
ChakraCore: 1.26, 0.83, 0.80
   GraalVM: 1.05, 1.12, 1.18

`

0

评论者:mfikes

已将 cljs-2931.patch 添加至 Patch Tender (i)

0
参考:[https://clojure.atlassian.net/browse/CLJS-2931](https://clojure.atlassian.net/browse/CLJS-2931)(由 favila 提报)
...