Привет эксперты Clojure,
Я пытаюсь провести некоторые временные тесты в Clojure 1.3, и я решил задать вопрос на основе существующего фрагмента кода, который решает дифференциальное уравнение, адаптированное из этого сообщения в блоге .
Код следует:
;; the differential equation is
;; dy/dt = f(y,t) = t - y
(defn f [t y] (- t y))
;; solve using Euler's method
(defn solveEuler [t0 y0 h iter]
(if (> iter 0)
(let [t1 (+ t0 h)
y1 (+ y0 (* h (f t0 y0)))]
(recur t1 y1 h (dec iter)))
[t0 y0 h iter]))
(defn multipleSolveEuler []
(let [steps '(1 10 100 1000 10000 100000)
results (map #(second (solveEuler 0.0 0.0 (/ 1.0 %) %)) steps)
errors (map #(- (Math/exp -1) %) results)]
(partition 3 (interleave steps results errors))))
(def *cpuspeed* 2.0)
(defmacro cyclesperit [expr its]
`(let [start# (. System (nanoTime))
ret# ( ~@expr (/ 1.0 ~its) ~its )
finish# (. System (nanoTime))]
(int (/ (* *cpuspeed* (- finish# start#)) ~its))))
(defn solveEuler-2 [t0 y0 h its]
(let [zero (int 0)]
(loop [t0 (double t0), y0 (double y0), h (double h), its (int its)]
(if (> its zero)
(let [t1 (+ t0 h)
y1 (+ y0 (* h (- t0 y0)))]
(recur t1 y1 h (dec its)))
[t0 y0 h its]))))
Так что, когда я говорю
(time solveItEuler-2 0.0 1.0 (/ 1.0 1000000000) 1000000000))
Я получаю время 6004,184 мсек на 6-месячном MacBook Pro. Я снова даю команду, и я в это же время обхожусь. Но когда я запускаю его 3 раза, я получаю время в диапазоне 3500 мсек. Я заметил это раньше для других фрагментов кода, и мне было интересно, почему это так. Полагаю, я ожидал бы примерно одинаковое время выполнения при последовательных запусках.
Это мое непонимание того, как работает "время", что-то, чего мне не хватает, или какое-то кеширование происходит под капотом?
Спасибо.