Clojureで再代入っぼい処理の速度比較

(println "def") (def seed 256) (dotimes[i 3] […]

(println "def") (def seed 256) (dotimes[i 3] […]

  • タグ:
  • タグはありません
(println "def")
(def seed 256)
(dotimes[i 3]
(def rnd seed)
(time(loop[i 0](when(< i 10000000)
(def rnd (mod (+(* 7 rnd) 13) 9564))
(recur(inc i))
)))
(println rnd)
)
(println "with-local-vars")
(dotimes[i 3]
(with-local-vars [rnd seed]
(time(loop[i 0](when(< i 10000000)
(var-set rnd (mod (+(* 7 @rnd) 13) 9564))
(recur(inc i))
)))
(println @rnd)
)
)
(println "atom")
(dotimes[i 3]
(let [rnd (atom seed)]
(time(loop[i 0](when(< i 10000000)
(reset! rnd (mod (+(* 7 @rnd) 13) 9564))
(recur(inc i))
)))
(println @rnd)
)
)
(println "volatile!")
(dotimes[i 3]
(let [rnd (volatile! seed)]
(time(loop[i 0](when(< i 10000000)
(vreset! rnd (mod (+(* 7 @rnd) 13) 9564))
(recur(inc i))
)))
(println @rnd)
)
)
(println "ref")
(dotimes[i 3]
(let [rnd (ref seed)](dosync
(time(loop[i 0](when(< i 10000000)
(ref-set rnd (mod (+(* 7 @rnd) 13) 9564))
(recur(inc i))
)))
(println @rnd)
))
)
(println "recur")
(dotimes[i 3]
(let [rnd "recur"]
(time(let [
rnd (loop[i 0,rnd seed](if(< i 10000000)
(recur(inc i) (mod (+(* 7 rnd) 13) 9564))
rnd
))
]
(println rnd)
))
)
)
;
;def
;"Elapsed time: 3512 msecs"
;20000000
;"Elapsed time: 3525 msecs"
;20000000
;"Elapsed time: 3498 msecs"
;20000000
;with-local-vars
;"Elapsed time: 3581 msecs"
;20000000
;"Elapsed time: 3501 msecs"
;20000000
;"Elapsed time: 3579 msecs"
;20000000
;atom
;"Elapsed time: 1608 msecs"
;20000000
;"Elapsed time: 1632 msecs"
;20000000
;"Elapsed time: 1609 msecs"
;20000000
;volatile!
;"Elapsed time: 1262 msecs"
;20000000
;"Elapsed time: 1264 msecs"
;20000000
;"Elapsed time: 1258 msecs"
;20000000
;ref
;"Elapsed time: 2442 msecs"
;20000000
;"Elapsed time: 2441 msecs"
;20000000
;"Elapsed time: 2427 msecs"
;20000000
;recur
;20000000
;"Elapsed time: 139 msecs"
;20000000
;"Elapsed time: 136 msecs"
;20000000
;"Elapsed time: 140 msecs"
;
;def
;"Elapsed time: 6431 msecs"
;9332
;"Elapsed time: 6395 msecs"
;9332
;"Elapsed time: 6392 msecs"
;9332
;with-local-vars
;"Elapsed time: 6519 msecs"
;9332
;"Elapsed time: 6567 msecs"
;9332
;"Elapsed time: 6421 msecs"
;9332
;atom
;"Elapsed time: 4394 msecs"
;9332
;"Elapsed time: 4405 msecs"
;9332
;"Elapsed time: 4384 msecs"
;9332
;volatile!
;"Elapsed time: 4014 msecs"
;9332
;"Elapsed time: 4050 msecs"
;9332
;"Elapsed time: 3993 msecs"
;9332
;ref
;"Elapsed time: 5260 msecs"
;9332
;"Elapsed time: 5257 msecs"
;9332
;"Elapsed time: 5318 msecs"
;9332
;recur
;9332
;"Elapsed time: 3492 msecs"
;9332
;"Elapsed time: 3478 msecs"
;9332
;"Elapsed time: 3470 msecs"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX