Here's another version that's almost as fast as Rich's and it even includes
the time for computing values.
(defn mk-random-map-fast [n]
(let [m (transient {})
r (new ec.util.MersenneTwisterFast)
ni (. r (nextInt))]
(loop [i 0 result m ni ni]
(if (= i n)
(persistent! m)
(recur (inc i) (assoc! m ni ni) (. r nextInt))))))
(defn fast-run [n]
(time
(let [m (mk-random-map-fast n)
rs (vals m)]
(reduce
(fn [s k] (let [v (get m k)]
(+ s (if (nil? v) 0 v))))
0
(take n (drop (/ n 2) rs))))))
; MacBook Pro Core 2 Duo 2.53ghz JDK 1.6 64bit
; ~40ms
(dotimes [_ 10]
(fast-run 32000))
; ~90ms
(dotimes [_ 10]
(fast-run 64000))
; ~180ms
(dotimes [_ 10]
(fast-run 128000))
; ~330ms
(dotimes [_ 10]
(fast-run 256000))
; ~700ms
(dotimes [_ 10]
(fast-run 512000))
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en