我在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中:
“经历时间:4535.442412 msecs”
但在lein repl
:
“经过时间:431.378074 msecs”
差异大约十倍!
所以,这是一个问题 - 为什么这么大的差异?
LTIR和lein repl
的Clojure版本为1.7.0
此代码不是我的,它来自codereview
答案 0 :(得分:4)
使用这样的时间会导致一个非常差的“微基准”,因为JVM“热身”是一个对运行时间有很大影响的功能,以及与小数据集相关的所有其他问题。
这个基准测试受环境差异影响的方式太多,即使在很短的时间内也会发生变化,直接回答。 Hugo Duncan编写了一个小library for accurately doing this kind of micro benchmark,你可能会在使用它的两个平台上运行相同的代码得到非常不同的结果。