请在2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面以了解更多关于如何使用本页面的信息。

0 投票
ClojureScript

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

使用迭代器可以显示在较大的集合和更频繁迭代时略有性能提升;在我的机器上(Ubuntu 18.04使用"Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz"),基准运行器大小(1000)和重复次数(100)没有明显差异。

`
(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上通过。

以下是这三个基准测试,扩展到涵盖所有虚拟机

`

        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 投票
...