LightTable与lein REPL中完成时间的区别

3

我在使用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

这段代码不是我写的,而是来自codereview


1
除了精彩且被接受的答案之外,Light Table还在做很多其他事情以便运行Leiningen(来运行您的代码)。所以...是的,这将需要更长时间。 - Kenny Evitt
1个回答

4
使用这种方式计时会导致非常差的“微基准测试”,因为JVM会“预热”一个函数,这可能会对运行时间产生很大影响,同时还存在与小数据集相关的所有其他问题。
有太多的方法可以影响这个基准测试,这些方法会随着时间的推移而改变,无法直接回答。Hugo Duncan编写了一个小型库,用于精确执行此类微基准测试,使用它在两个平台上运行相同的代码可能会得到非常不同的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接