Я просматриваю книгу программирования «Clojure» Chas Emerick, Brian Carper и Christophe Grand.Clojure последовательный вызов функции и памятка
В части, касающейся memoization, я заметил значительно меньшее время, прошедшее для второго (и других) вызовов функции, даже не используя memoization.
Уверенный, используя memoization уменьшенное время на порядок величины, но мне интересно, если Clojure выполняет что-то вроде memoization внутренне.
Вот код:
(defn prime?
[n]
(cond
(== 1 n) false
(== 2 n) true
(even? n) false
:else (->> (range 3 (inc (Math/sqrt n)) 2)
(filter #(zero? (rem n %)))
empty?)))
(def n 123)
(time (prime? n))
(time (prime? n))
(let [m-prime? (memoize prime?)]
(time (m-prime? n))
(time (m-prime? n)))
И выход:
"Elapsed time: 0.235977 msecs"
"Elapsed time: 0.054549 msecs"
"Elapsed time: 0.045127 msecs"
"Elapsed time: 0.003814 msecs"
Итак, почему второй вызов почти в 5 раз быстрее, чем первый?
Я думаю, вы пропустили JIT. Я думаю, что первое повышение производительности - это работа JIT. – fl00r
ОК, может быть, кто-то может предложить хорошее вступительное чтение о том, как Clojure компилируется на Java-байт-код? –