评论者:michalmarczyk
首先,为了完整性,这里有一个新的补丁(0001-CLJ-1372-consistent-hasheq-for-java.util.-List-Map-M-alternative.patch),它不会对其他类型进行额外的咕哝。在单个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 %的运行时间
评估计数:在60个样本的10922728次调用中为655363680。
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
评估计数:在60个样本的11265319次调用中为675919140。
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
评估计数:在60个样本的9583128次调用中为574987680。
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 %的运行时间
评估计数:在60个样本的30488421次调用中为1829305260。
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 % 异常值略微增加了方差
评估计数:在60个样本的30968339次调用中为1858100340。
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
评估计数:在60个样本的26548870次调用中为1592932200。
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)] #(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需要1.258952964663877 %的运行时间
评估计数:在60个样本的16796141次调用中为1007768460。
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)))
评估计数:在60个样本的10799068次调用中为647944080。
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
评估计数:在60个样本的11658436次调用中为699506160。
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 % 异常值略微增加了方差
评估计数:在60个样本的9915333次调用中为594919980。
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
`