评论者:michalmarczyk
嗨,亚伦,
感谢您调查此事!
根据我能观察到的,这个改动极大地提升了{{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毫秒(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毫秒(2.5%)
执行时间上四分位数:3.025812毫秒(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,在277317次调用中的60个样本。
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))
评估次数: 18536880,在308948次调用中的60个样本。
Execution time mean : 3.412992 us
Execution time std-deviation : 81.338284 ns
执行时间下四分位数: 3.303888微秒(2.5%)
执行时间上四分位数: 3.545549微秒(97.5%)
nil
`
显然,只要transient满足它们的契约,语义就得到了保留。
我想我可能没有为这个任务启动一个ggroup线程,抱歉。