Может ли кто-нибудь объяснить, почему время скачет на порядок, просто обернув это функцией?Зачем это делать в функции за 10 раз дольше?
user> (time (loop [n 0 t 0]
(if (= n 10000000)
t
(recur (inc n) (+ t n)))))
"Elapsed time: 29.312145 msecs"
49999995000000
user> (defn tl [r] (loop [n 0 t 0]
(if (= n r)
t
(recur (inc n) (+ t n)))))
#<[email protected]: #object[user$eval3462$tl__3463 0x7d8ba46 "[email protected]"]>
user> (time (tl 10000000))
"Elapsed time: 507.333844 msecs"
49999995000000
Мне любопытно, как простая итерация, как это, может быть выполнена намного быстрее. Например, аналогичный итеративный цикл в C++ занимает менее 1 мс в режиме деблокирования или около 20 мс в режиме отладки в той же системе, что и этот код Clojure.
два followups: Я попытался это с '^ Integer' без разницы ; почему «длинный» необходим для десяти процентов? и 2) почему «длинный» нижний регистр, но '^ Integer' должен быть капитализирован или не будет компилироваться? 3), поскольку аргумент arg передается только один раз, при вызове функции этого «unboxing» один раз достаточно, чтобы вызвать такое огромное увеличение времени? – johnbakers
@ johnbakers Я продолжу свой ответ – OlegTheCat