Clojure LightTable和lein REPL中完成时间之间的差异

Clojure LightTable和lein REPL中完成时间之间的差异,clojure,leiningen,read-eval-print-loop,lighttable,Clojure,Leiningen,Read Eval Print Loop,Lighttable,我面临着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-prim

我面临着
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毫秒”

但是在
lein repl
中:

“运行时间:431.378074毫秒”

相差十倍左右

所以,问题是——为什么会有这么大的差异

LTIR和
lein repl的Clojure版本是
1.7.0


这段代码不是我的,它来自

像这样使用时间会导致非常糟糕的“微基准测试”,因为JVM“预热”功能可能会对运行时间产生很大影响,以及与小数据集相关的所有其他问题


有太多的方式,这个基准可能会受到环境差异的影响,即使在很短的时间内,环境差异也会发生变化,无法直接回答。雨果·邓肯(Hugo Duncan)写了一篇小文章,使用它在两个平台上运行相同的代码可能会得到非常不同的结果。

为了补充这一精彩且公认的答案,Light Table还做了一系列其他工作,以便它可以运行Leiningen(运行代码)。所以是的,要花很长时间。