2015-04-03 82 views
2

鉴于此代码:经过时间评估

(reduce my-fun my-lazy-seq) 

测量整个操作的经过时间:

(time (reduce my-fun my-lazy-seq)) ;;Elapsed time: 1000.1234 msecs 

如何测量这个循环在不同阶段所经过的时间在完成之前?例如:

Elapsed time to process next 1000 samples in my-lazy-seq: 100.1234 msecs 
Elapsed time to process next 1000 samples in my-lazy-seq: 99.1234 msecs 
Elapsed time to process next 1000 samples in my-lazy-seq: 101.1234 msecs 
... 
+1

我认为一个解决办法是懒惰的序列转换成大小1000批次的懒惰序列,并把周围的每一批次的处理的时间......但我不确定如何以干净的方式完成第一步,因为原始代码已经非常简单和优雅。 – CJLam 2015-04-03 15:20:17

回答

2
(doseq [thousand (partition 1000 my-lazy-seq)] 
    (time (reduce my-fun thousand))) 
1

如何:

(defn seq-counter [n coll] 
    (let [t0 (System/currentTimeMillis) 
     f (fn [i x] 
      (let [i (inc i)] 
       (if (= 0 (rem i n)) 
       (println i "items processed in" (- (System/currentTimeMillis) t0) "ms.")) 
       x))] 
    (map-indexed f coll))) 

map-indexed用于检查进展情况。上述功能将在每个元素中打印计数和处理时间。

user=> (reduce + (seq-counter 10 (range 100))) 
10 items processed in 0 ms. 
20 items processed in 0 ms. 
... 
100 items processed in 1 ms. 
4950 

参考Idiomatic clojure for progress reporting?

+0

一个很小的调整,因为'if'只有一个分支,所以可以放一个'when' – 2015-04-03 09:16:28