评论由:michalmarczyk 发布
首先,为了完整起见,这里是一个新的补丁(0001-CLJ-1372-consistent-hasheq-for-java.util.-List-Map-M-alternative.patch),它不会为未处理的其他类型执行额外的murmur操作。对于单个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需要.runtime的1.409118084170768 %
评估计数:655363680在60个样品中的10922728次调用。
Execution time mean : 96.459888 ns
Execution time std-deviation : 1.019817 ns
执行的低位量:95.079086 ns(2.5%)
执行的时间高位量:98.684168 ns(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 ns(2.5%)
执行的时间高位量:90.755688 ns(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 ns(2.5%)
执行的时间高位量:106.071144 ns(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需要.runtime的1.3353133083866688 %
评估计数:1829305260在60个样品中的30488421次调用。
Execution time mean : 34.205701 ns
Execution time std-deviation : 0.379106 ns
执行的低位量:33.680636 ns(2.5%)
执行的时间高位量:34.990138 ns(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 ns(2.5%)
执行的时间高位量:30.871497 ns(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 ns(2.5%)
执行的时间高位量:36.918183 ns(97.5%)
Overhead used : 1.718257 ns
在60个样本中发现了1个异常值(1.6667%)
low-severe 1 (1.6667 %)
从离群值中分发的方差:1.6389 % 方差略微受到离群值的影响
nil
`
PHM以及新的补丁(默认情况无额外murmur步骤)和类/字符/变量结果
`
用户=> (let [phm (apply hash-map (interleave (range 128) (range 128))) juhm (java.util.HashMap. phm)] #_(assert (= (hash phm) (hash juhm))) (c/bench (unchecked-add (clojure.lang.Util/hasheq phm) (unchecked-add (clojure.lang.Util/hasheq "foo") (clojure.lang.Util/hasheq 123)))))
警告:最终GC需要.runtime的1.258952964663877 %
评估计数:1007768460在60个样品中的16796141次调用。
Execution time mean : 58.195608 ns
Execution time std-deviation : 0.482804 ns
执行的低位量:57.655857 ns(2.5%)
执行的时间高位量:59.154655 ns(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 ns(2.5%)
执行的时间高位量:92.711120 ns(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 ns(2.5%)
执行的时间高位量:85.569206 ns(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 ns(2.5%)
执行的时间高位量:102.167675 ns(97.5%)
Overhead used : 1.567532 ns
在60个样本中发现了3个异常值(5.0000%)
low-severe 3 (5.0000 %)
从离群值中分发的方差:1.6389 % 方差略微受到离群值的影响
nil
`