评论由:michalmarczyk发表
嗨 Aaron,
感谢你对此事的关注!
根据我观察到的,这个更改极大地提高了大型地图的 {{zipmap}} 时间。对于小型地图,有轻微的改进。以下是在补丁中定义的 REPL 的两个基本 Criterium 基准测试({{transient-zipmap}})
`
; 大型地图
user=> (def xs (range 16384))
'user/xs
user=> (last xs)
16383
user=> (c/bench (zipmap xs xs))
评估次数:13920次,其中60个样本为232个调用。
Execution time mean : 4.329635 ms
Execution time std-deviation : 77.791989 us
执行时间下四分位数:4.215050 毫秒(2.5%)
执行时间上四分位数:4.494120 毫秒(97.5%)
null
user=> (c/bench (transient-zipmap xs xs))
评估次数:21180,在 60 个样本的 353 次调用中。
Execution time mean : 2.818339 ms
Execution time std-deviation : 110.751493 us
执行时间下四分位数:2.618971 毫秒(2.5%)
执行时间上四分位数:3.025812 毫秒(97.5%)
在 60 个样本中找到 2 个异常值(3.3333%)
low-severe 2 (3.3333 %)
异常值的方差:25.4675%,方差受到异常值的影响而适度膨胀
null
;; 小映射
user=> (def ys (range 16))
'user/ys
user=> (last ys)
15
user=> (c/bench (zipmap ys ys))
评估次数:16639020,在 60 个样本的 277317 次调用中。
Execution time mean : 3.803683 us
Execution time std-deviation : 88.431220 ns
执行时间下四分位数:3.638146 微秒(2.5%)
执行时间上四分位数:3.935160 微秒(97.5%)
null
user=> (c/bench (transient-zipmap ys ys))
评估次数:18536880,在 60 个样本的 308948 次调用中。
Execution time mean : 3.412992 us
Execution time std-deviation : 81.338284 ns
执行时间下四分位数:3.303888 微秒(2.5%)
执行时间上四分位数:3.545549 微秒(97.5%)
null
`
显然,只要瞬态满足其规范,语义就能得到保留。
我想我可能没有开始一个 ggroup 线程来处理这个,对不起。