Kann jemand erklären, warum die Zeit um eine Größenordnung springt, einfach indem man das in eine Funktion einwickelt?Warum dauert es 10x länger, um diese Funktion zu verwenden?
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
Ich bin gespannt, wie eine einfache Iteration wie diese viel schneller gemacht werden kann. Zum Beispiel benötigt eine ähnliche iterative Schleife in C++ weniger als 1 ms im Freigabemodus oder etwa 20 ms im Debugmodus auf demselben System wie dieser Clojure-Code.
zwei followups: ich das versucht hatte, mit '^ Integer' ohne Unterschied ; Warum ist 'lang' für ein arg von zehn Millionen notwendig? und 2) warum ist "long" kleingeschrieben, aber "^ Integer" muss groß geschrieben werden oder wird nicht kompiliert? 3) Da der Arg nur einmal beim Funktionsaufruf übergeben wird, reicht dieses "Unboxing" nur einmal aus, um einen so großen Zeitgewinn zu verursachen? – johnbakers
@johnbakers Ich werde meine Antwort erweitern – OlegTheCat