【发布时间】:2010-08-12 03:39:36
【问题描述】:
假设我用以下方式定义所有自然数的序列:
(def naturals (iterate inc 0))
我还定义了一个将 naturals 映射到 nil 的函数,它需要一些时间来计算,如下所示:
(defn hard-comp [_] (Thread/sleep 500))
注意评估以下 s 表达式的计算时间,由 clojure.core/time 测量。
(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 在使用显式范围调用时比使用自然部分快约 6 倍。
由于(= (range 30) (take 30 naturals))返回true并且两个对象都是clojure.lang.LazySeq类型,并且clojure在调用函数之前评估函数的所有参数,如何解释上述时间细节?
【问题讨论】:
标签: performance optimization map clojure parallel-processing