Disons que je définir la séquence de tous les nombres naturels de la manière suivante:Clojure Cartographie parallèle et des séquences infinies
(def naturals (iterate inc 0))
je définis également une fonction cartographie des Naturals à zéro qui prend un certain temps pour calculer comme ceci:
(defn hard-comp [_] (Thread/sleep 500))
Notez le temps de calcul pour les evaulate s-expressions suivantes telle que mesurée par 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 msecs
(dorun (pmap hard-comp (doall (take 30 naturals)))) ;
3004.499013 msec
(doall (take 30 naturals)) ;
0.385724 msecs
(range 30)
; 0,159374 msecs
pmap
est ~ 6 fois plus rapide lorsqu'il est appelé avec une plage explicite qu'avec une section des naturels.
Puisque (= (range 30) (take 30 naturals))
renvoie true et que les deux objets sont de type clojure.lang.LazySeq
, et que clojure évalue tous les arguments d'une fonction avant d'appeler la fonction, comment les détails de synchronisation ci-dessus peuvent-ils être expliqués?