查看ArrayList与transients的对比,我并没有发现太多的差异
java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12)
OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode, sharing)
clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version "1.11.1"}}}'
Clojure 1.11.1
(defn make-al [^long c]
(loop [i 0
out (java.util.ArrayList.)]
(if (< i c)
(do
(.add ^java.util.ArrayList out i)
(recur (inc i) out))
out)))
(dotimes [_ 20] (time (make-al 10000000)))
;; drop 10
"持续时间: 118.936307毫秒"
"持续时间: 378.941495毫秒"
"持续时间: 451.090741毫秒"
"持续时间: 231.632739毫秒"
"持续时间: 533.601017毫秒"
"持续时间: 178.208623毫秒"
"持续时间: 566.648574毫秒"
"持续时间: 223.109572毫秒"
"持续时间: 404.011696毫秒"
"持续时间: 374.543087毫秒"
(defn make-pv [^long c]
(loop [i 0
out (transient [])
(if (< i c)
recur (inc i) (conj! out i)
(persistent! out))))
(dotimes [_ 20] (time (make-pv 10000000)))
;; drop 10
"持续时间: 238.714966毫秒"
"持续时间: 139.776764毫秒"
"持续时间: 287.93457毫秒"
"持续时间: 212.816761毫秒"
"持续时间: 337.137074毫秒"
"持续时间: 386.315848毫秒"
"持续时间: 208.427246毫秒"
"持续时间: 291.750425毫秒"
"持续时间: 321.466389毫秒"
"持续时间: 251.875222毫秒"
但是,在查看HashMap与PersistentMap的transients对比时,我确实看到了显著的差异(慢了10倍)
(defn make-hm [^long c]
(loop [i 0
out (java.util.HashMap.)
(if (< i c)
(do
(.put ^java.util.HashMap out i i)
(recur (inc i) out))
out)))
(dotimes [_ 20] (time (make-hm 10000000)))
;; drop 10
"持续时间: 949.351029毫秒"
"持续时间: 719.626631毫秒"
"持续时间: 664.274403毫秒"
"持续时间: 718.46743毫秒"
"持续时间: 880.380957毫秒"
"持续时间: 735.682114毫秒"
"持续时间: 611.627886毫秒"
"持续时间: 775.128433毫秒"
已用时间:537.130159 毫秒
已用时间:775.980626 毫秒
(函数定义 (defn make-pm [^long c)
(loop [i 0
out (transient {}))
(if (< i c)
(递归 (inc i) (assoc! out i i))
(persistent! out))))
(dotimes [_ 20] (时间 (make-pm 10000000)))
已用时间:5129.976085 毫秒
已用时间:5626.573669 毫秒
已用时间:5337.985317 毫秒
已用时间:5151.215195 毫秒
已用时间:5175.246837 毫秒
已用时间:5636.8717 毫秒
已用时间:5136.285851 毫秒
已用时间:5270.226782 毫秒
已用时间:5018.800694 毫秒
已用时间:5394.596752 毫秒
基于此,我认为考虑如何使后者更快是有趣的。