评论由: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个样本中的232次调用,共13920次。
Execution time mean : 4.329635 ms
Execution time std-deviation : 77.791989 us
执行时间最低分位数:4.215050毫秒(2.5%)
执行时间最高分位数:4.494120毫秒(97.5%)
None
user=> (c/bench (transient-zipmap xs xs))
评估次数:60个样本中的353次调用,共21180次。
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%,方差被异常值适度地膨胀
None
;;; 小型映射
用户=> (def 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%)
None
用户=> (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%)
None
`
显然,只要瞬态能够满足其合约,语义得到保留。
我认为我可能没有为此开启一个ggroup线程,抱歉。