评论者: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))
评估次数:在60次抽样中为13920次,每次调用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))
评估次数:在60次抽样中为21180次,每次调用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
;;; 小型映射
user=> (def ys (range 16))
'user/ys
user=> (last ys)
15
用户=> (c/bench (zipmap ys ys))
评估次数:16639020,在277317次调用中的60个样本。
Execution time mean : 3.803683 us
Execution time std-deviation : 88.431220 ns
执行时间下四分位数:3.638146微秒(25%)
执行时间上四分位数:3.935160微秒(97.5%)
nil
用户=> (c/bench (transient-zipmap ys ys))
评估次数:18536880,在308948次调用中的60个样本。
Execution time mean : 3.412992 us
Execution time std-deviation : 81.338284 ns
执行时间下四分位数:3.303888微秒(25%)
执行时间上四分位数:3.545549微秒(97.5%)
nil
`
只要transients满足它们的合约,语义显然得到保留。
我认为我可能没有启动这个ggroup线程,抱歉。