评论者:michalmarczyk
嗨,Aaron,
感谢您调查此事!
根据我所观察到的,这个改动大大提高了大映射的{{zipmap}}时间。对于小映射,也有小幅的改进。以下是两个基本的Criterium基准(在REPL中定义为补丁中的{{transient-zipmap}})
`
;; 大映射
user=> (def xs (range 16384))
'user/xs
user=> (last xs)
16383
user=> (c/bench (zipmap xs xs))
评估计数:60个样本中的2,320次调用,共计13,920次。
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 ms(2.5%)
执行时间上四分位数:3.025812 ms(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
user=> (c/bench (zipmap ys ys))
评估次数:16639020次,共60个样本,277317次调用。
Execution time mean : 3.803683 us
Execution time std-deviation : 88.431220 ns
执行时间下四分位数:3.638146 us(2.5%)
执行时间上四分位数:3.935160 us(97.5%)
nil
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 us(2.5%)
执行时间上四分位数:3.545549 us(97.5%)
nil
`
只要临时值满足它们的协议,可以保留语义。
我想我可能没有为这个ggroup线程开始,抱歉。