Разница между временем завершения в LightTable и 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 потребовалось:

"Прошедшее время: 4535,442412 мс"

но в lein repl:

«Прошедшее время: 431,378074 мс»

Разница примерно в десять раз!

Так вот вопрос - почему такая большая разница?

Версия Clojure для LTIR и lein repl равна 1.7.0

Этот код не мой, он взят из codereview


person Roman Makhlin    schedule 29.12.2015    source источник
comment
Чтобы добавить к замечательному и принятому ответу, Light Table также делает кучу других вещей, чтобы он мог запускать Leiningen (для запуска вашего кода). Так что... да, это займет намного больше времени.   -  person Kenny Evitt    schedule 05.01.2016


Ответы (1)


такое использование времени делает очень плохой «микротест», потому что JVM «разогревает» функцию, которая может оказать большое влияние на время выполнения, наряду со всеми другими проблемами, связанными с небольшими наборами данных.

Существует слишком много способов, которыми на этот эталон могут повлиять различия в окружающей среде, которые будут меняться даже в течение короткого промежутка времени, чтобы дать прямой ответ. Хьюго Дункан написал небольшую библиотеку для точного выполнения такого микротеста, и вы, скорее всего, получите совсем другие результаты. от запуска одного и того же кода на обеих платформах, использующих его.

person Arthur Ulfeldt    schedule 29.12.2015