评论者: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次样本中为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 ms(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次,分布在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
用户=> (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线程,抱歉。