Skip to content

Instantly share code, notes, and snippets.

@astrangeguy
Created February 23, 2010 23:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save astrangeguy/312873 to your computer and use it in GitHub Desktop.
Save astrangeguy/312873 to your computer and use it in GitHub Desktop.
(defprotocol Settable
(set-val! [mutable newval]))
(deftype unsynchronized-raw-box [#^{:unsynchronized-mutable true} val]
clojure.lang.IDeref
(deref [] val)
Settable
(set-val! [newval] (set! val newval)))
(let [a 1
b 2
box (unsynchronized-raw-box a)]
(dotimes [_ 10]
(time (dotimes [_ 10000000]
(set-val! box a)
(set-val! box b)))))
"Elapsed time: 64.949612 msecs"
"Elapsed time: 33.790096 msecs"
"Elapsed time: 36.375978 msecs"
"Elapsed time: 31.626686 msecs"
"Elapsed time: 31.390412 msecs"
"Elapsed time: 33.930687 msecs"
"Elapsed time: 36.672316 msecs"
"Elapsed time: 33.789399 msecs"
"Elapsed time: 31.617536 msecs"
"Elapsed time: 31.929937 msecs"
(let [a 1
b 2
box (atom a)]
(dotimes [_ 10]
(time (dotimes [_ 10000000]
(reset! box a)
(reset! box b)))))
"Elapsed time: 394.484753 msecs"
"Elapsed time: 387.050261 msecs"
"Elapsed time: 406.516909 msecs"
"Elapsed time: 386.690437 msecs"
"Elapsed time: 349.206909 msecs"
"Elapsed time: 358.410415 msecs"
"Elapsed time: 364.278847 msecs"
"Elapsed time: 360.751779 msecs"
"Elapsed time: 433.286039 msecs"
"Elapsed time: 355.322019 msecs"
(let [a 1
b 2
box (clojure.lang.Box. a)]
(dotimes [_ 10]
(time (dotimes [_ 10000000]
(set! (.val box) a)
(set! (.val box) b)))))
"Elapsed time: 45.705549 msecs"
"Elapsed time: 47.722432 msecs"
"Elapsed time: 30.760789 msecs"
"Elapsed time: 32.69093 msecs"
"Elapsed time: 34.100332 msecs"
"Elapsed time: 31.004816 msecs"
"Elapsed time: 31.849479 msecs"
"Elapsed time: 34.290581 msecs"
"Elapsed time: 30.90627 msecs"
"Elapsed time: 33.529796 msecs"
(defmacro time-without-ret
"Evaluates expr and prints the time it took. Returns nil."
[expr]
`(let [start# (. System (nanoTime))]
~expr
(prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs"))))
(deftype Bench [#^{:unsynchronized-mutable true} val]
Runnable
(run [] (let [a 1 b 2]
(set! val a)
(dotimes [_ 10]
(time-without-ret (dotimes [_ 10000000]
(set! val a)
(set! val b)))))))
(.run (Bench 1))
"Elapsed time: 29.30358 msecs"
"Elapsed time: 47.739091 msecs"
"Elapsed time: 37.177694 msecs"
"Elapsed time: 41.198596 msecs"
"Elapsed time: 40.169135 msecs"
"Elapsed time: 41.234703 msecs"
"Elapsed time: 39.963732 msecs"
"Elapsed time: 39.991809 msecs"
"Elapsed time: 40.180728 msecs"
"Elapsed time: 40.001725 msecs"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment