Skip to content

Instantly share code, notes, and snippets.

@shirok
Created April 26, 2020 04:07
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 shirok/8c0dbd9a503ad3cd06a5c0e7ff2094f3 to your computer and use it in GitHub Desktop.
Save shirok/8c0dbd9a503ad3cd06a5c0e7ff2094f3 to your computer and use it in GitHub Desktop.
Benchmark: ran giterate0, giterate0-1, giterate0-2, giterate0-3, giterate1, giterate1-1, giterate1-2, giterate2, each for 10 times.
giterate0: 6.322 real, 6.310 cpu (6.300 user + 0.010 sys)@1.58/s n=10
giterate0-1: 6.336 real, 6.320 cpu (6.320 user + 0.000 sys)@1.58/s n=10
giterate0-2: 6.583 real, 6.560 cpu (6.560 user + 0.000 sys)@1.52/s n=10
giterate0-3: 6.538 real, 6.520 cpu (6.520 user + 0.000 sys)@1.53/s n=10
giterate1: 7.110 real, 7.110 cpu (7.110 user + 0.000 sys)@1.41/s n=10
giterate1-1: 7.004 real, 7.010 cpu (7.010 user + 0.000 sys)@1.43/s n=10
giterate1-2: 6.564 real, 6.560 cpu (6.560 user + 0.000 sys)@1.52/s n=10
giterate2: 5.977 real, 5.980 cpu (5.980 user + 0.000 sys)@1.67/s n=10
Rate giterate0 giterate0-1 giterate0-2 giterate0-3 giterate1 giterate1-1 giterate1-2 giterate2
giterate0 2/s -- 1.002 1.040 1.033 1.127 1.111 1.040 0.948
giterate0-1 2/s 0.998 -- 1.038 1.032 1.125 1.109 1.038 0.946
giterate0-2 2/s 0.962 0.963 -- 0.994 1.084 1.069 1.000 0.912
giterate0-3 2/s 0.968 0.969 1.006 -- 1.090 1.075 1.006 0.917
giterate1 1/s 0.887 0.889 0.923 0.917 -- 0.986 0.923 0.841
giterate1-1 1/s 0.900 0.902 0.936 0.930 1.014 -- 0.936 0.853
giterate1-2 2/s 0.962 0.963 1.000 0.994 1.084 1.069 -- 0.912
giterate2 2/s 1.055 1.057 1.097 1.090 1.189 1.172 1.097 --
(use gauche.time)
(use gauche.generator)
(define (giterate0 f x)
(^[]
(begin0 x
(set! x (f x)))))
(define (giterate0-1 f x)
(^[]
(rlet1 x_ x
(set! x (f x)))))
(define (giterate0-2 f x)
(let ((x_ x))
(^[]
(set! x_ x)
(set! x (f x))
x_)))
(define (giterate0-3 f x . dummy)
(^[]
(if (null? dummy)
(set! dummy #t)
(set! x (f x)))
x))
(define (giterate1 f x)
(gcons* x
(^[]
(set! x (f x))
x)))
(define (gcons1 item g)
(define (gen)
(set! gen g)
item)
(^[] (gen)))
(define (giterate1-1 f x)
(gcons1 x
(^[]
(set! x (f x))
x)))
(define (giterate1-2 f x)
(let ((first #t)
(x x))
(^[] (if first
(begin (set! first #f) x)
(begin (set! x (f x)) x)))))
(define (giterate2 f x)
(^[]
(set! x (f x))
x))
(define (runner proc)
(^[] ((gdrop (proc (cut + 1 <>) 1) 10000000))))
(define (main args)
(time-these/report
10
`((giterate0 . ,(runner giterate0))
(giterate0-1 . ,(runner giterate0-1))
(giterate0-2 . ,(runner giterate0-2))
(giterate0-3 . ,(runner giterate0-3))
(giterate1 . ,(runner giterate1))
(giterate1-1 . ,(runner giterate1-1))
(giterate1-2 . ,(runner giterate1-2))
(giterate2 . ,(runner giterate2))
)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment