评论由:michalmarczyk 发表
首先,为了完整性,这里有一个新的补丁(0001-CLJ-1372-consistent-hasheq-for-java.util.-List-Map-M-alternative.patch),该补丁对于未另外处理的类型不会进行额外咕哝(murmuring)。单 PHM 案例中运行较慢;详细信息请见下文。此外,这里是 GitHub 上的分支
https://github.com/michalmarczyk/clojure/tree/alien-hasheq-3
至于新的结果,性能损失相当大,我担心
`
;;; 与补丁(murmur hashCode 默认版本)相比
user=> (let [class-instance java.lang.String character-instance \a var-instance #'hash] (c/bench (clojure.lang.Util/hasheq class-instance)) (c/bench (clojure.lang.Util/hasheq character-instance)) (c/bench (clojure.lang.Util/hasheq var-instance)))
警告:最终 GC 需要 1.409118084170768 % 的运行时间
评估计数:655363680 在 60 个样本中,每个样本 10922728 次。
Execution time mean : 96.459888 ns
Execution time std-deviation : 1.019817 ns
执行时间下四分位数:95.079086 纳秒(2.5%)
执行时间上四分位数:98.684168 纳秒(97.5%)
Overhead used : 1.708347 ns
评估计数:675919140 在 60 个样本中,每个样本 11265319 次。
Execution time mean : 88.965959 ns
Execution time std-deviation : 0.825226 ns
执行时间下四分位数:87.817159 纳秒(2.5%)
执行时间上四分位数:90.755688 纳秒(97.5%)
Overhead used : 1.708347 ns
评估计数:574987680 在 60 个样本中,每个样本 9583128 次。
Execution time mean : 103.881498 ns
Execution time std-deviation : 1.103615 ns
执行时间下四分位数:102.257474 纳秒(2.5%)
执行时间上四分位数:106.071144 纳秒(97.5%)
Overhead used : 1.708347 ns
在60个样本中找到1个异常值(1.6667%)
low-severe 1 (1.6667 %)
异常值方差:1.6389 % 异常值导致方差略微膨胀
nil
;;; 1.6.0
user=> (let [class-instance java.lang.String character-instance \a var-instance #'hash] (c/bench (clojure.lang.Util/hasheq class-instance)) (c/bench (clojure.lang.Util/hasheq character-instance)) (c/bench (clojure.lang.Util/hasheq var-instance)))
警告:最终 GC 需要 1.3353133083866688 % 的运行时间
评估计数:1829305260 在 60 个样本中,每个样本 30488421 次。
Execution time mean : 34.205701 ns
Execution time std-deviation : 0.379106 ns
执行时间下四分位数:33.680636 纳秒(2.5%)
执行时间上四分位数:34.990138 纳秒(97.5%)
Overhead used : 1.718257 ns
在60个样本中发现了2个异常值(3.3333%)
low-severe 1 (1.6667 %)
low-mild 1 (1.6667 %)
异常值方差:1.6389 % 异常值导致方差略微膨胀
评估计数:1858100340 在 60 个样本中,每个样本 30968339 次。
Execution time mean : 30.401309 ns
Execution time std-deviation : 0.213878 ns
执行时间下四分位数:30.095976 纳秒(2.5%)
执行时间上四分位数:30.871497 纳秒(97.5%)
Overhead used : 1.718257 ns
评估计数:1592932200 在 60 个样本中,每个样本 26548870 次。
Execution time mean : 36.292934 ns
Execution time std-deviation : 0.333512 ns
执行时间下四分位数:35.795063 纳秒(2.5%)
执行时间上四分位数:36.918183 纳秒(97.5%)
Overhead used : 1.718257 ns
在60个样本中找到1个异常值(1.6667%)
low-severe 1 (1.6667 %)
异常值方差:1.6389 % 异常值导致方差略微膨胀
nil
`
使用新补丁(默认情况下无额外 murmur 步骤)的单 PHM 和 Class/Character/Var 结果
`
用户=> (let [phm (apply hash-map (interleave (range 128) (range 128))) juhm (java.util.HashMap. phm)] 最终GC所需时间占1.028614538339401%的运行时间
警告:最终 GC 需要 1.258952964663877 % 的运行时间
评估计数:1007768460 在 60 个样本中,每个样本 16796141 次。
Execution time mean : 58.195608 ns
Execution time std-deviation : 0.482804 ns
执行时间下四分位数:57.655857 纳秒(2.5%)
执行时间上四分位数:59.154655 纳秒(97.5%)
Overhead used : 1.567532 ns
在60个样本中找到1个异常值(1.6667%)
low-severe 1 (1.6667 %)
异常值方差:1.6389 % 异常值导致方差略微膨胀
nil
user=> (let [class-instance java.lang.String character-instance \a var-instance #'hash] (c/bench (clojure.lang.Util/hasheq class-instance)) (c/bench (clojure.lang.Util/hasheq character-instance)) (c/bench (clojure.lang.Util/hasheq var-instance)))
评估计数:647944080 在 60 个样本中,每个样本 10799068 次。
Execution time mean : 91.275863 ns
Execution time std-deviation : 0.659943 ns
执行时间下四分位数:90.330980 纳秒(2.5%)
执行时间上四分位数:92.711120 纳秒(97.5%)
Overhead used : 1.567532 ns
评估计数:699506160 在 60 个样本中,每个样本 11658436 次。
Execution time mean : 84.564131 ns
Execution time std-deviation : 0.517071 ns
执行时间下四分位数:83.765607 纳秒(2.5%)
执行时间上四分位数:85.569206 纳秒(97.5%)
Overhead used : 1.567532 ns
在60个样本中找到1个异常值(1.6667%)
low-severe 1 (1.6667 %)
异常值方差:1.6389 % 异常值导致方差略微膨胀
评估计数:594919980 在 60 个样本中,每个样本 9915333 次。
Execution time mean : 100.336792 ns
Execution time std-deviation : 0.811312 ns
执行时间下四分位数:99.313490 纳秒(2.5%)
执行时间上四分位数:102.167675 纳秒(97.5%)
Overhead used : 1.567532 ns
在 60 个样本中发现 3 个异常值(5.0000 %)
low-severe 3 (5.0000 %)
异常值方差:1.6389 % 异常值导致方差略微膨胀
nil
`