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"