LightTable 和 lein REPL 中完成时间的区别
Difference between time of completion in LightTable and lein REPL
我在 lein repl
和 LightTable Instarepl(LTIR) 之间面临奇怪的完成时间差异。例如下面的代码:
(defn lazy-primes
([] (cons 2 (lazy-seq (lazy-primes 3 [ 2 ]))))
([current calculated-primes]
(loop [ [first-prime & rest-primes] calculated-primes]
(if (> (* first-prime first-prime) current)
(cons current (lazy-seq (lazy-primes
(inc current)
(conj calculated-primes current))))
(if (= 0 (mod current first-prime))
(lazy-seq (lazy-primes (inc current) calculated-primes))
(recur rest-primes))))))
(time (last (take 10001 (lazy-primes))))
在我的 LTIR 中花费了:
"Elapsed time: 4535.442412 msecs"
但在 lein repl
:
"Elapsed time: 431.378074 msecs"
十倍左右的差距!
那么,问题来了 - 为什么差异如此之大?
LTIR 和 lein repl
的 Clojure 版本是 1.7.0
此代码不是我的,它来自 codereview
像这样使用时间会造成非常糟糕的 "micro benchmark" 因为 JVM "warm's up" 一个函数会对 运行 时间产生很大影响,以及所有其他相关问题使用小数据集。
这个基准受环境差异影响的方式太多,即使在很短的时间尺度内也会发生变化,因此无法直接回答。 Hugo Duncan 写了一个小 library for accurately doing this kind of micro benchmark,您可能会从 运行 使用它的两个平台上的相同代码得到非常不同的结果。
我在 lein repl
和 LightTable Instarepl(LTIR) 之间面临奇怪的完成时间差异。例如下面的代码:
(defn lazy-primes
([] (cons 2 (lazy-seq (lazy-primes 3 [ 2 ]))))
([current calculated-primes]
(loop [ [first-prime & rest-primes] calculated-primes]
(if (> (* first-prime first-prime) current)
(cons current (lazy-seq (lazy-primes
(inc current)
(conj calculated-primes current))))
(if (= 0 (mod current first-prime))
(lazy-seq (lazy-primes (inc current) calculated-primes))
(recur rest-primes))))))
(time (last (take 10001 (lazy-primes))))
在我的 LTIR 中花费了:
"Elapsed time: 4535.442412 msecs"
但在 lein repl
:
"Elapsed time: 431.378074 msecs"
十倍左右的差距!
那么,问题来了 - 为什么差异如此之大?
LTIR 和 lein repl
的 Clojure 版本是 1.7.0
此代码不是我的,它来自 codereview
像这样使用时间会造成非常糟糕的 "micro benchmark" 因为 JVM "warm's up" 一个函数会对 运行 时间产生很大影响,以及所有其他相关问题使用小数据集。
这个基准受环境差异影响的方式太多,即使在很短的时间尺度内也会发生变化,因此无法直接回答。 Hugo Duncan 写了一个小 library for accurately doing this kind of micro benchmark,您可能会从 运行 使用它的两个平台上的相同代码得到非常不同的结果。