*描述*
有时,将一组值与单个值进行比较是有用的,Clojure internally defines a predicate for this exact purpose,它在性能上比仅仅部分应用“=”有一些优点。
与 Rich 的先前讨论:
https://groups.google.com/forum/#!topic/clojure-dev/0c-VNhEKVkI
*用途示例*
;;之前
(map (partial = 3) coll)
;;之后
(map (=to 3) coll)
*基准测试*
||test|||(partial = 'foo)||#(= 'foo %)|||(=to 'foo)|||
|小型同质集合|217ns|165ns|39ns|
|小型异质集合,|192ns|167ns|41ns|
|大型同质集合|66us|52us|8us|
|大型异质集合|82us|66us|27us|
*完整的基准测试输出*
(use 'criterium.core)
(defn benchmark-f [f]
(let [colls [['foo 'foo 'foo]
[1 :foo 'foo]
(doall (repeat 1e3 'foo))
(doall (take 1e3 (cycle [1 :foo 'foo])))]]
(doseq [c colls]
(quick-bench (run! f c)))))
(benchmark-f (partial = 'foo))
WARNING: Final GC required 1.405293826432628 % of runtime
WARNING: Final GC required 10.202923149112559 % of runtime
Evaluation count : 3116130 in 6 samples of 519355 calls.
Execution time mean : 217.723199 ns
Execution time std-deviation : 29.425291 ns
Execution time lower quantile : 189.944710 ns ( 2.5%)
Execution time upper quantile : 261.717351 ns (97.5%)
Overhead used : 1.863362 ns
WARNING: Final GC required 4.2579397621583315 % of runtime
Evaluation count : 3138636 in 6 samples of 523106 calls.
Execution time mean : 198.985418 ns
Execution time std-deviation : 12.691848 ns
Execution time lower quantile : 182.441245 ns ( 2.5%)
Execution time upper quantile : 207.839280 ns (97.5%)
Overhead used : 1.863362 ns
WARNING: Final GC required 6.631646134523004 % of runtime
Evaluation count : 10038 in 6 samples of 1673 calls.
Execution time mean : 66.977712 µs
Execution time std-deviation : 10.411821 µs
Execution time lower quantile : 59.620690 µs ( 2.5%)
Execution time upper quantile : 84.483254 µs (97.5%)
Overhead used : 1.863362 ns
Found 1 outliers in 6 samples (16.6667 %)
low-severe 1 (16.6667 %)
Variance from outliers : 47.3059 % Variance is moderately inflated by outliers
WARNING: Final GC required 5.272721959665122 % of runtime
Evaluation count : 7908 in 6 samples of 1318 calls.
Execution time mean : 82.588512 µs
Execution time std-deviation : 5.215537 µs
Execution time lower quantile : 75.977936 µs ( 2.5%)
Execution time upper quantile : 86.849982 µs (97.5%)
Overhead used : 1.863362 ns
(benchmark-f #(= 'foo %))
WARNING: Final GC required 1.284421364203217 % of runtime
WARNING: Final GC required 10.04376144830405 % of runtime
评估次数:3643032次,分布在6个样本中,每个样本包含607172次调用。
平均执行时间:165.393131纳秒
执行时间标准差:1.041355纳秒
执行时间下四分位数:164.277060纳秒(2.5%)
执行时间上四分位数:166.849951纳秒(97.5%)
使用的开销:1.605524纳秒
警告:最终垃圾回收器消耗了运行时6.258680973295933 %
评估次数:3584574次,分布在6个样本中,每个样本包含597429次调用。
平均执行时间:167.659014纳秒
执行时间标准差:3.821817纳秒
执行时间下四分位数:164.175156纳秒(2.5%)
执行时间上四分位数:173.210781纳秒(97.5%)
使用的开销:1.605524纳秒
Found 1 outliers in 6 samples (16.6667 %)
低严重 1 (16.6667 %)
异常值的方差:13.8889 %,方差因异常值而适度膨胀
警告:最终垃圾回收器消耗了运行时6.914389197005716 %
评估次数:11196次,分布在6个样本中,每个样本包含1866次调用。
平均执行时间:52.593759微秒
执行时间标准差:834.220092纳秒
(基准-f (=to 'foo))
警告:最终垃圾回收器消耗了运行时7.40391654943877 %
评估次数:15169068次,分布在6个样本中,每个样本包含2528178次调用。
执行时间平均:39.937424纳秒
执行时间标准差:2.782661纳秒
执行时间下四分位数:37.393937纳秒(2.5%)
执行时间上四分位数:42.780432纳秒(97.5%)
Overhead used : 1.863362 ns
警告:最终垃圾回收器消耗了运行时5.986859953402835 %
评估次数:15199992次,分布在6个样本中,每个样本包含2533332次调用。
执行时间平均:41.229082纳秒
执行时间标准差:2.815533纳秒
执行时间下四分位数:37.371527纳秒(2.5%)
执行时间上四分位数:43.208673纳秒(97.5%)
Overhead used : 1.863362 ns
警告:最终垃圾回收器消耗了运行时5.039484046472016 %
评估次数:69462次,分布在6个样本中,每个样本包含11577次调用。
执行时间平均:8.976972微秒
执行时间标准差:587.089991纳秒
执行时间下四分位数:8.505317微秒(2.5%)
执行时间上四分位数:9.744296微秒(97.5%)
Overhead used : 1.863362 ns
警告:最终垃圾回收器消耗了运行时5.773010947849351 %
评估次数:23352次,分布在6个样本中,每个样本包含3892次调用。
执行时间平均:27.277376微秒
执行时间标准差:2.115666微秒
执行时间下四分位数:25.719322微秒(2.5%)
执行时间上四分位数:30.123547微秒(97.5%)
Overhead used : 1.863362 ns
*补丁*:0001-CLJ-1843-add-to-for-faster-equality-check-against-kn.patch