评论者:michalmarczyk
嗨,Aaron,
感谢你对此事的调查!
从我能够观察到的来看,这个改变大大提高了{{zipmap}}对于大型地图的时间。对于小型地图,有小幅度提升。以下有两个基本的Criterium基准({{transient-zipmap}}定义在REPL中,如补丁中所述)
`
;;; 大型地图
user=> (def xs (range 16384))
'user/xs
user=> (last xs)
16383
user=> (c/bench (zipmap xs xs))
评估次数:在60次样本中每次232个调用,共13920次。
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次样本中每次353个调用,共21180次。
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))
评估计数:16639020,在277317次调用中的60个样本。
Execution time mean : 3.803683 us
Execution time std-deviation : 88.431220 ns
执行时间下四分位数:3.638146 us ( 2.5%)
执行时间上四分位数:3.935160 us (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 us ( 2.5%)
执行时间上四分位数:3.545549 us (97.5%)
nil
`
显然,只要转瞬即逝的满足他们的合约,语义就被保留了。
我想我可能没有为这个任务启动一个ggroup线程,对不起。