[gambit-list] Are optional arguments slow?

Marc Feeley feeley at iro.umontreal.ca
Wed Feb 10 13:38:43 EST 2010


On 2010-02-10, at 11:57 AM, Alex Queiroz wrote:

> Hallo,
> 
>     I was wondering if the use of optional arguments conses or is
> otherwise slow and should be avoided in performace-critical code?

Gambit's parameter handling including optional and keyword parameters does not cons (except when there is a rest parameter).  Optional parameters are handled faster than keyword parameters.  Here's a test which may shed some light on the time each kind of parameter handling takes.  This was executed on a 2.8 GHz intel core 2 duo.  As you can see, optional parameters are handled reasonably quickly (comparable to a required parameter).

Marc

(declare
 (standard-bindings)
 (block)
 (fixnum)
 (not safe)
 (not inline)
)

(define (f a) (if a a a))
(define (g a #!optional (b 11) (c 22)) (if a b c))
(define (h a #!optional (b 11) #!key (c 22)) (if a b c))

(define (loop0 n) (if (> n 0) (begin (f #t) (loop0 (- n 1)))))
(define (loop1 n) (if (> n 0) (begin (g #t) (loop1 (- n 1)))))
(define (loop2 n) (if (> n 0) (begin (g #t 1) (loop2 (- n 1)))))
(define (loop3 n) (if (> n 0) (begin (g #t 1 2) (loop3 (- n 1)))))
(define (loop4 n) (if (> n 0) (begin (h #t 1 c: 2) (loop4 (- n 1)))))

(time (loop0 100000000))
(time (loop1 100000000))
(time (loop2 100000000))
(time (loop3 100000000))
(time (loop4 100000000))

; results:
;
;(time (loop0 100000000))
;    1053 ms real time
;    1052 ms cpu time (1051 user, 1 system)
;    no collections
;    no bytes allocated
;    1 minor fault
;    no major faults
;(time (loop1 100000000))
;    1049 ms real time
;    1047 ms cpu time (1046 user, 1 system)
;    no collections
;    no bytes allocated
;    no minor faults
;    no major faults
;(time (loop2 100000000))
;    1253 ms real time
;    1253 ms cpu time (1251 user, 2 system)
;    no collections
;    no bytes allocated
;    no minor faults
;    no major faults
;(time (loop3 100000000))
;    1351 ms real time
;    1351 ms cpu time (1349 user, 2 system)
;    no collections
;    no bytes allocated
;    no minor faults
;    no major faults
;(time (loop4 100000000))
;    4471 ms real time
;    4467 ms cpu time (4462 user, 5 system)
;    no collections
;    no bytes allocated
;    no minor faults
;    no major faults




More information about the Gambit-list mailing list