Created
February 23, 2010 23:52
-
-
Save astrangeguy/312873 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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