ho copiato il codice:Clojure transitori Esempio - Nessun aumento di velocità significativa
ma i miei risultati differiscono signifiantly da ciò che è stato pubblicato.
(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"
Questo è un leggero aumento di velocità, ma niente come la spinta 8x implicita nei documenti di esempio?
partire java in modalità server cambia la storia, ma ancora niente come la documentazione ..
(quick-bench (def v (vrange 1000000)))
"Elapsed time: 121.14 msecs"
(quick-bench (def v2 (vrange2 1000000)))
"Elapsed time: 75.15 msecs"
E 'che le implementazioni persistenti sono migliorate da quando il post sulla transitori qui: http://clojure.org/transients?
Quali altri fattori potrebbero contribuire alla mancanza di boost con i transienti?
Sto usando la versione 1.7 di Java di OpenJDK su ubuntu 12.04. Forse è molto più lento della (presunta) versione di Hotspot 1.6 usata nei documenti? Ma questo non implicherebbe che entrambi i test dovrebbero essere più lenti di alcuni costanti, con lo stesso gap?
Grazie Diego. Questo era ciò che speravo * fosse la ragione. In altre parole, non è che i transitori siano più lenti di quelli riportati nei documenti, è che le collezioni persistenti sono più veloci. – Scott