vector-map
oku@sandbox ~/proj $ cat check.scm (import (rnrs)) (let ((v (make-vector (* 1024 1024) 0))) (display (vector-length (vector-map (lambda (n) (+ n 1)) v))))
oku@sandbox ~/proj $ time mosh check.scm CALL: stack expansion (中略) 1048576 real 0m2.906s user 0m2.012s sys 0m0.809s
oku@sandbox ~/proj $ time ypsilon --heap-limit=256 check.scm 1048576 real 0m0.922s user 0m1.396s sys 0m0.296s
ちょっと書き換えるとほぼ同じになる。
oku@sandbox ~/proj $ cat check.scm (import (rnrs)) (define (myvector-map proc v) (let* ((len (vector-length v)) (nv (make-vector len))) (define (itr x) (if (= len x) nv (begin (vector-set! nv x (proc (vector-ref v x))) (itr (+ x 1))))) (itr 0))) (let ((v (make-vector (* 1024 1024) 0))) (display (vector-length (myvector-map (lambda (n) (+ 1 n)) v))))
oku@sandbox ~/proj $ time mosh check.scm 1048576 real 0m0.261s user 0m0.210s sys 0m0.047s
oku@sandbox ~/proj $ time ypsilon --heap-limit=256 check.scm 1048576 real 0m0.188s user 0m0.164s sys 0m0.039s