Qualcuno può spiegare perché il tempo salta di un ordine di grandezza semplicemente avvolgendolo in una funzione?Perché eseguire il wrapping di questa funzione richiede 10 volte di più?
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
Sono curioso come una semplice iterazione di come questo può essere fatto molto più veloce. Ad esempio, un loop iterativo simile in C++ impiega meno di 1 ms in modalità Release o circa 20 ms in modalità Debug sullo stesso sistema di questo codice Clojure.
due followup: avevo provato questo con '^ Integer' senza differenze ; perché è "lungo" necessario per un argomento di dieci milioni? e 2) perché è "lungo" in minuscolo ma "^ Integer" deve essere in maiuscolo o non verrà compilato? 3) poiché l'argomento viene passato una sola volta, durante la chiamata di funzione, questo "unboxing" è sufficiente una sola volta per causare un così enorme aumento di tempo? – johnbakers
@johnbakers Estenderò la mia risposta – OlegTheCat