Benchmarking srfi-41, srfi-121 and srfi-158 Amirouche Boubekki (01 Aug 2020 14:29 UTC)
Re: Benchmarking srfi-41, srfi-121 and srfi-158 Amirouche Boubekki (01 Aug 2020 14:39 UTC)
Re: Benchmarking srfi-41, srfi-121 and srfi-158 John Cowan (02 Aug 2020 00:59 UTC)
Re: Benchmarking srfi-41, srfi-121 and srfi-158 Amirouche Boubekki (02 Aug 2020 08:11 UTC)
Re: Benchmarking srfi-41, srfi-121 and srfi-158 Linus Björnstam (02 Aug 2020 10:03 UTC)
Re: Benchmarking srfi-41, srfi-121 and srfi-158 John Cowan (04 Aug 2020 14:18 UTC)
Re: Benchmarking srfi-41, srfi-121 and srfi-158 Marc Nieper-Wißkirchen (02 Aug 2020 15:22 UTC)

Benchmarking srfi-41, srfi-121 and srfi-158 Amirouche Boubekki 01 Aug 2020 14:29 UTC

% rlwrap guile -L .
GNU Guile 3.0.1
Copyright (C) 1995-2020 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
xxxxxx@(guile-user)> (import (benchmark))
xxxxxx@(guile-user)> ,time (do-times (expt 2 8) (lambda () (sum/stream
(expt 2 16))))
$1 = 2147450880
;; 16.941247s real time, 36.446301s run time.  24.590046s spent in GC.
xxxxxx@(guile-user)> ,time (do-times (expt 2 8) (lambda ()
(sum/generator (expt 2 16))))
$2 = 2147450880
;; 0.941287s real time, 0.951202s run time.  0.013206s spent in GC.
xxxxxx@(guile-user)>
%

Here is the content of benchmark.scm:

(define-module (benchmark))

(use-modules (srfi srfi-41))
(use-modules (rnrs io ports))

(define-public (do-times n thunk)
  (let loop ((n n)
             (out 0))
    (if (zero? n)
        out
        (loop (- n 1) (thunk)))))

(define (make-iota count start step)
  (lambda ()
    (cond
      ((<= count 0)
       (eof-object))
      (else
        (let ((result start))
         (set! count (- count 1))
         (set! start (+ start step))
         result)))))

(define (generator-fold f seed generator)
  (let loop ((obj (generator))
             (seed seed))
    (if (eof-object? obj)
        seed
        (loop (generator) (f obj seed)))))

(define-public (sum/stream n)
  (stream-fold + 0 (stream-range 0 n)))

(define-public (sum/generator n)
  (generator-fold + 0 (make-iota n 0 1)))