Diciamo che io definisco la sequenza di tutti i numeri naturali nel seguente modo:Clojure mappatura parallela e sequenze infinite
(def naturals (iterate inc 0))
Ho anche definire una funzione di mappatura dei prodotti naturali a zero che vuole un po 'per calcolare in questo modo:
(defn hard-comp [_] (Thread/sleep 500))
Nota il tempo di calcolo per evaulate seguenti s-espressioni come misurato da clojure.core/time
.
(dorun (map hard-comp (range 30))) ;
15010,367496 msec
(dorun (pmap hard-comp (range 30))) ;
537.044554 msec
(dorun (map hard-comp (doall (take 30 naturals))))) ;
15009.488499 msec
(dorun (pmap hard-comp (doall (take 30 naturals)))) ;
3004.499013 msec
(doall (take 30 naturals)) ;
0.385724 msec
(range 30)
; 0,159374 msecs
pmap
è ~ 6 volte più veloce quando viene chiamato con un intervallo esplicito rispetto a una sezione dei naturali.
Poiché (= (range 30) (take 30 naturals))
restituisce true e entrambi gli oggetti sono di tipo clojure.lang.LazySeq
e il clojure evaula tutti gli argomenti di una funzione prima di chiamare la funzione, come possono essere spiegati i dettagli di temporizzazione di cui sopra?