评论者:michalmarczyk
嗨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 ms(2.5%)
执行时间上四分位数:4.494120 ms(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
;;; 小型图
用户=> (定义 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线程,对此表示歉意。