skopiowane kod z:Clojure Transients Przykład - Nie znaczące przyspieszenie
ale moje wyniki różnią signifiantly od tego, co napisali.
(defn vrange [n]
(loop [i 0 v []]
(if (< i n)
(recur (inc i) (conj v i))
v)))
(defn vrange2 [n]
(loop [i 0 v (transient [])]
(if (< i n)
(recur (inc i) (conj! v i))
(persistent! v))))
(quick-bench (def v (vrange 1000000)))
"Elapsed time: 459.59 msecs"
(quick-bench (def v2 (vrange2 1000000)))
"Elapsed time: 379.85 msecs"
To niewielkie przyspieszenie, ale nic podobnego do wzmocnienia 8x sugerowanego w przykładowych dokumentach?
Zaczynając Java w trybie serwera zmienia historię, ale nadal nic podobnego docs ..
(quick-bench (def v (vrange 1000000)))
"Elapsed time: 121.14 msecs"
(quick-bench (def v2 (vrange2 1000000)))
"Elapsed time: 75.15 msecs"
się, że uporczywe implementacje poprawiły się od słupka o nieustalonych tutaj: http://clojure.org/transients?
Jakie inne czynniki mogą przyczyniać się do braku przyspieszenia z przejściami?
Używam wersji 1.7 java OpenJDK na Ubuntu 12.04. Może to dużo wolniej niż (domniemana) wersja Hotspot 1.6 używana w dokumentach? Ale czy to nie sugerowałoby, że oba testy powinny być wolniejsze przez jakieś stałe, z taką samą luką?
Dzięki Diego. Tego właśnie miałem nadzieję *. Innymi słowy, nie chodzi o to, że transjenty są wolniejsze niż opisane w dokumentach, to że trwałe kolekcje są szybsze. – Scott