代码之家  ›  专栏  ›  技术社区  ›  Roman Makhlin

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

  •  3
  • Roman Makhlin  · 技术社区  · 9 年前

    我在完成时间内面临着奇怪的差异 lein repl 和LightTable Instarrepl(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毫秒”

    但在 雷恩回复 :

    “已用时间:431.378074毫秒”

    大约相差十倍!

    那么,问题来了——为什么差异这么大?

    用于LTIR和 雷恩回复 1.7.0

    这个代码不是我的,它来自 codereview

    1 回复  |  直到 7 年前
        1
  •  4
  •   Arthur Ulfeldt    9 年前

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

    环境差异会在很短的时间内发生变化,这一基准可能会受到太多的影响,无法直接回答。雨果·邓肯写了一个小 library for accurately doing this kind of micro benchmark 在使用它的两个平台上运行相同的代码可能会得到非常不同的结果。