2013-09-24 44 views

回答

2

對於初學者來說,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類型,你就失去了這些優勢(以換取更好的性能)。

+0

awesomethx !!!!! –

1

您可能會感興趣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" 
相關問題