這似乎慢:在clojure中添加兩個整數數組的最快方法是什麼?
(time (doall (map + (range 1000000) (range 1000000))))
"Elapsed time: 13951.664454 msecs"
如何做得更快?
這似乎慢:在clojure中添加兩個整數數組的最快方法是什麼?
(time (doall (map + (range 1000000) (range 1000000))))
"Elapsed time: 13951.664454 msecs"
如何做得更快?
對於初學者來說,range並不是一個數組,它會產生一個lazy-seq。
添加兩個數字集合的最快方法可能是首先讓它們在數組中,並且執行迭代循環而不是映射。
user> (time (let [a (int-array (range 1000000))
b (int-array (range 1000000))]
(dotimes [i 1000000]
(aset a i (+ (aget b i) (aget a i))))
a))
"Elapsed time: 771.100395 msecs"
#<int[] [[email protected]>
user>
注意這仍然具有創造和兩個範圍調用實現懶seqs的開銷,在實際性能,你很可能已經有越來越的累計工序之前建造的數據。
除非這是您的代碼中的性能瓶頸,否則這樣做會意味着您不應該首先使用clojure。使用clojure的優點是您可以獲得高層次的不可變數據結構,從而實現透明且可並行的代碼。一旦你下降到像數組這樣的原始jvm類型,你就失去了這些優勢(以換取更好的性能)。
awesomethx !!!!! –
您可能會感興趣Prismatic的"open-source array processing library HipHip, which combines Clojure's expressiveness with the fastest math Java has to offer"。
我剛剛有了一個快速的去用它,它似乎能夠提供表現力和性能之間的很好的平衡:
注:我使用Criterium的基準這個,因爲它減少了一些問題,對標杆JVM。
(require '[criterium.core :refer [quick-bench]])
(quick-bench (doall (map + (range 1000000) (range 1000000))))
;=> "Execution time mean : 791.955406 ms"
(require '[hiphip.int :as h])
(quick-bench (h/amap [x (h/amake [i 1000000] i)
y (h/amake [i 1000000] i)]
(+ x y)))
;=> "Execution time mean : 20.540645 ms"
也見[這裏]'amap' clojuredoc(http://clojuredocs.org/clojure_core/clojure.core/amap) –