Sun Jul 28 15:39:14 JST 2013

Gaucheでは positive? _ つかうより > _ 0 の方がいいよという話

(use srfi-1)
(for-each
  (lambda (i)
    (let1 j (- i 30000)
      (if
      ;(positive? j)
      (> j 0)
      #t #f)
      ))
  (iota 10000000))

焼き鈍し法やってて, positive?って名前長いからゼロとの大小比較に書き換えたら地味に速くなった

てっきり R5RS で定義されてるくらいのプリミティブな手続きだから 最適化されてるものだと思ったけど別にそうでもないんだね

追記 (Sat Aug 24 21:25:44 JST 2013)

positive?より>のほうが早い場合もあるけど,そうでない場合もあった

(time (for-each (^i (if (positive? 1) 'true 'false)) (iota *N*)))
; real   0.155
; user   0.150
; sys    0.000

(time (for-each (^i (if (positive? -23) 'true 'false)) (iota *N*)))
; real   0.131
; user   0.130
; sys    0.000

(time (for-each (^i (if (> 1 0) 'true 'false)) (iota *N*)))
; real   0.140
; user   0.140
; sys    0.000

定数を引数にしてもしょうがないでしょ

(time (for-each (^i (if (positive? i) 'true 'false)) (iota *N*)))
; real   0.166
; user   0.160
; sys    0.000

(time (for-each (^i (if (> i 0) 'true 'false)) (iota *N*)))
; real   0.141
; user   0.140
; sys    0.000

うん,やっぱり positive? より > のが早い

マクロにするのが良いな

(define-macro (positive? x) `(> ,x 0))