比方說,我定義所有自然數按以下方式順序:Clojure的並行映射和無窮序列
(def naturals (iterate inc 0))
我也定義一個函數映射土黃爲零需要一段時間來計算,如下所示:
(defn hard-comp [_] (Thread/sleep 500))
注計算時間由clojure.core/time
測量evaulate以下s表達式。
(dorun (map hard-comp (range 30))) ;
15010.367496毫秒
(dorun (pmap hard-comp (range 30))) ;
537.044554毫秒
(dorun (map hard-comp (doall (take 30 naturals))))) ;
15009.488499毫秒
(dorun (pmap hard-comp (doall (take 30 naturals)))) ;
3004.499013毫秒
(doall (take 30 naturals)) ;
0.385724毫秒
(range 30)
; 0.159374 msecs
pmap
當用明確的範圍調用比使用自然段更快〜6倍。
由於(= (range 30) (take 30 naturals))
返回true,並且兩個對象的類型都是clojure.lang.LazySeq
,並且clojure在調用該函數前會對函數的所有參數進行蒸發,所以上述時間細節如何解釋?