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,您可能会从 运行 使用它的两个平台上的相同代码得到非常不同的结果。