Zamanın neden bir işlevi büyük ölçüde sarmalayarak bunu neden bir işlevle sardığını açıklayabilir mi?Neden bu işlevi bir işlevde çalıştırmak 10x daha uzun sürüyor?
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
Böyle basit bir yinelemenin nasıl daha hızlı yapılabileceğini merak ediyorum. Örneğin, C++'daki benzer yineleme döngüsü, Release modunda 1 ms'den daha az veya bu Clojure koduyla aynı sistemde Debug modunda yaklaşık 20 ms alır.
iki followups:
alternatif olarak açık bir şekilde döngü önce ilkel geçirilen bağımsız değişkeni dönüştürebilir ima yazmak için hiçbir fark^Integer' 'ile denemiş ; On milyonluk bir arg için neden 'uzun' gereklidir? ve 2) neden 'uzun' küçük harf ama 'Tamsayı' büyük harfle mi yoksa derlenmeyecek mi? 3) arg sadece bir kez geçti, fonksiyon çağrısında, bu "unboxing" bir kez sadece bu kadar büyük bir zaman artışı neden yeterlidir? – johnbakers
@johnbakers Cevabımı uzatacağım – OlegTheCat