を見ると,ArrayList 与を渡す瞬态と JSON レスポンス形式、HTTP レスポンスステータスを変更するGitHubでのコミットで、いくつかの重要な計画が進展しています
% java -version
openjdk 版本 "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 msecs"
"消耗时间: 287.93457 msecs"
"消耗时间: 212.816761 msecs"
"消耗时间: 337.137074 msecs"
"消耗时间: 386.315848 msecs"
"消耗时间: 208.427246 msecs"
"消耗时间: 291.750425 msecs"
"消耗时间: 321.466389 msecs"
"消耗时间: 251.875222 msecs"
但是,在查看 HashMap 与瞬态 PersistentMap 之际,我确实看到了一个显著的差异(慢了 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 msecs"
"消耗时间: 719.626631 msecs"
"消耗时间: 664.274403 msecs"
"消耗时间: 718.46743 msecs"
"消耗时间: 880.380957 msecs"
"消耗时间: 735.682114 msecs"
"消耗时间: 611.627886 msecs"
"消耗时间: 775.128433 msecs"
"消耗时间: 537.130159 msecs"
已过时间:775.980626 毫秒
(定义 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 毫秒
基于此,我认为考虑如何使后者更快是有趣的。