Skip to content

Instantly share code, notes, and snippets.

@shirok
Created April 25, 2020 20:37
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/d79ebb73a1a1d0ff1bbf0052a5458b93 to your computer and use it in GitHub Desktop.
Save shirok/d79ebb73a1a1d0ff1bbf0052a5458b93 to your computer and use it in GitHub Desktop.
Benchmark: ran giterate0, giterate0-1, giterate0-2, giterate1, giterate1-1, giterate2, each for 10 times.
giterate0: 14.390 real, 21.430 cpu (21.250 user + 0.180 sys)@0.47/s n=10
giterate0-1: 6.278 real, 6.270 cpu ( 6.270 user + 0.000 sys)@1.59/s n=10
giterate0-2: 6.561 real, 6.560 cpu ( 6.560 user + 0.000 sys)@1.52/s n=10
giterate1: 7.057 real, 7.050 cpu ( 7.050 user + 0.000 sys)@1.42/s n=10
giterate1-1: 6.960 real, 6.960 cpu ( 6.960 user + 0.000 sys)@1.44/s n=10
giterate2: 5.934 real, 5.930 cpu ( 5.930 user + 0.000 sys)@1.69/s n=10
Rate giterate0 giterate0-1 giterate0-2 giterate1 giterate1-1 giterate2
giterate0 0/s -- 0.293 0.306 0.329 0.325 0.277
giterate0-1 2/s 3.418 -- 1.046 1.124 1.110 0.946
giterate0-2 2/s 3.267 0.956 -- 1.075 1.061 0.904
giterate1 1/s 3.040 0.889 0.930 -- 0.987 0.841
giterate1-1 1/s 3.079 0.901 0.943 1.013 -- 0.852
giterate2 2/s 3.614 1.057 1.106 1.189 1.174 --
(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 (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 (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))
(giterate1 . ,(runner giterate1))
(giterate1-1 . ,(runner giterate1-1))
(giterate2 . ,(runner giterate2))
)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment