運行OP的代碼,以獲得我的機器上的基準時間。 (Mac Pro的2009年2.66 GHz的四核英特爾®至強®,48 GB RAM。Clojure的1.6.0。的Java 1.8.0_40 Java的熱點(TM)64位服務器VM)。
user> (time (count (apply vector-of :double (repeat 100000 0))))
"Elapsed time: 992.688709 msecs"
100000
嘗試(repeat 100000 0.0)
長,以消除雙倍轉換。沒有太大的變化。
user> (time (count (apply vector-of :double (repeat 100000 0.0))))
"Elapsed time: 965.876047 msecs"
100000
創建載體,然後添加元素,更快:
user> (time (count (into (vector-of :double) (repeat 100000 0.0))))
"Elapsed time: 52.856371 msecs"
100000
稍快,不建立一個懶惰的序列:
(defn n-conj [n coll elem]
(if (zero? n)
coll
(recur (dec n) (conj coll elem) elem)))
(time (count (n-conj 100000 (vector-of :double) 0.0)))
"Elapsed time: 37.86183 msecs"
100000
顯然'矢量一個可變超載-of'沒有針對大輸入進行優化。我在這裏創建了一個關於它的問題http://dev.clojure.org/jira/browse/CLJ-1695 – 2015-04-03 19:55:20
僅供參考它現在已經固定在主頁上https://github.com/clojure/clojure/commit/bcb8e9a7aa0b0588b4872384256d86bf53d12f15 – 2015-04-10 18:03:12