评论者: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
;;; 小型地图
user=> (def ys (range 16))
'user/ys
user=> (last ys)
15
user=> (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
user=> (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线程,抱歉。