假设我按照以下方式定义所有自然数的序列:
我也定义了一个将自然数映射到nil的函数,计算时间较长,代码如下:
请注意使用
(def naturals (iterate inc 0))
我也定义了一个将自然数映射到nil的函数,计算时间较长,代码如下:
(defn hard-comp [_] (Thread/sleep 500))
请注意使用
clojure.core/time
测量以下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毫秒
当调用带有显式范围的pmap
而不是naturals部分时,速度大约快了6倍。
由于(= (range 30) (take 30 naturals))
返回true,并且两个对象都是类型为clojure.lang.LazySeq
,并且Clojure在调用函数之前评估所有参数,则如何解释上述时间详细信息?