2014-11-20 10 views
5

ho copiato il codice:Clojure transitori Esempio - Nessun aumento di velocità significativa

http://clojure.org/transients

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?

risposta

1

I risultati sono coerenti con la mia esperienza con i transienti. Li ho usati un po 'e di solito vedo un miglioramento delle prestazioni 2x.

Ho provato questo su Ubuntu 12.04, OpenJDK 1.7 con Clojure 1.6.0 e 1.7.0-alpha3. Ottengo prestazioni 2x con transienti, leggermente inferiore al 3x che ottengo su OSX con il jvm Oracle 1.8.

Anche la pagina di cui sopra da tempo della Clojure 1.2, e la performance delle collezioni è notevolmente migliorata da allora. Ho provato l'esperimento con 1.2 ma Criterium non funziona con esso, quindi ho dovuto usare il tempo proprio come su quella pagina. Ovviamente i risultati sono significativamente variabili (da 2x a 8x). Ho il sospetto che l'esempio nella documentazione potrebbe essere stato selezionato.

+0

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

Problemi correlati