评论由:michalmarczyk
Hi Aaron,
谢谢您关注这个问题!
据我观察,这个更改大幅提高了大地图的{{zipmap}}性能。对于小地图,有一些轻微的提高。以下有两个基本的Criterium基准测试({{transient-zipmap}}在补丁中定义为REPL,如下所示)
`
;;; 大地图
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%)
nil
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% 异常值使得方差适度膨胀
nil
;; 小图
用户=> (def ys (range 16))
'用户/ys
用户=> (last ys)
15
用户=> (c/bench (zipmap ys ys))
评估次数:在 60 个样本中对 277317 次调用进行评估,共计 16639020 次。
Execution time mean : 3.803683 us
Execution time std-deviation : 88.431220 ns
执行时间下四分位数:3.638146 微秒(2.5%)
执行时间上四分位数:3.935160 微秒(97.5%)
nil
用户=> (c/bench (transient-zipmap ys ys))
评估次数:在 60 个样本中对 308948 次调用进行评估,共计 18536880 次。
Execution time mean : 3.412992 us
Execution time std-deviation : 81.338284 ns
执行时间下四分位数:3.303888 微秒(2.5%)
执行时间上四分位数:3.545549 微秒(97.5%)
nil
`
显然,只要临时的语义满足其合同,语义就能得到保留。
我认为我可能没有为此启动一个ggroup线程,抱歉。