Czy ktoś może wyjaśnić, dlaczego czas skacze o rząd wielkości po prostu zawijając to w funkcję?Dlaczego owijanie tego w funkcję trwa 10 razy dłużej?
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
Jestem ciekawy, jak po prostu taka iteracja może być wykonana znacznie szybciej. Na przykład podobna iteracyjna pętla w C++ trwa mniej niż 1 ms w trybie Release lub około 20 ms w trybie debugowania w tym samym systemie co ten kod Clojure.
dwa followups: próbowałem to z '^ Integer' bez różnicy ; dlaczego 'long' jest konieczny dla argumentu 10 milionów? i 2) dlaczego 'long' ma małą literę, ale'^Integer' musi być napisane wielkimi literami lub nie będzie kompilowane? 3) skoro argument jest przekazywany tylko raz, przy wywołaniu funkcji, to "rozpakowanie" tylko jeden raz wystarczy, aby spowodować tak duży wzrost czasu? – johnbakers
@johnbakers Przedłużę moją odpowiedź – OlegTheCat