2014-11-20 11 views
5

skopiowane kod z:Clojure Transients Przykład - Nie znaczące przyspieszenie

http://clojure.org/transients

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ą?

Odpowiedz

1

Twoje wyniki są zgodne z moim doświadczeniem z transjentami. Użyłem ich całkiem sporo i zazwyczaj widzę poprawę wydajności 2x.

Próbowałem tego na Ubuntu 12.04, OpenJDK 1.7 z Clojure 1.6.0 i 1.7.0-alpha3. Dostaję 2x wydajność z transjentami, nieco mniej niż 3x, które dostaję na OSX z 1.8 jvm Oracle.

Również powyższa strona pochodzi z czasów Clojure 1.2, a wydajność kolekcji znacznie się poprawiła od tego czasu. Próbowałem eksperymentu z 1.2, ale Criterium nie działa z nim, więc musiałem użyć czasu tak jak na tej stronie. Oczywiście wyniki są znacznie zmienne (od 2x do 8x). Podejrzewam, że przykład w dokumentacji mógł zostać wyselekcjonowany.

+0

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