I was doing some benchmarking the other day and I am puzzled by the following
factorial benchmark:
(define (call n proc . args)
(let loop ((i 0))
(when (< i n) (apply proc args) (loop (+ 1 i)))))
(define (fac x)
(if (= x 0) 1
(* x (fac (- x 1)))))
(define n
(string->number (car (reverse (argv)))))
(time (call 10000000 (lambda () (fac n)))); works for n<13
(display "result:") (display (fac n)) (newline)
This is extremely fast:
$ csc -Ob fact.scm
$ ./fact 7
0.176 seconds elapsed
0 seconds in (major) GC
0 mutations
1 minor GCs
0 major GCs
result:5040
This is CHICKEN Version 2.732 on macosx-unix-gnu-x86.
OTOH, if I change a single line and I replace
(call 10000000 (lambda () (fac n)))
with
(call 10000000 fac n)
my programs runs ten times slower:
./fact 7
1.631 seconds elapsed
0.011 seconds in (major) GC
0 mutations
1881 minor GCs
23 major GCs
result:5040
All the time is spent in garbage collection.
I am just curious to know which optimization I am breaking and
why the compiler cannot be smart enough. Any idea?
Michele Simionato
_______________________________________________
Chicken-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/chicken-users