I would like to pass along an observation on returning multiple values. I wrote a C function that needed to return two values to scheme, an int and a pointer. Ultimately, I allocated a scheme object for the pointer prior to the call, passed it as an argument, then manipulated the contents in C, "passing" it back---as is the common idiom. But for a while I toyed with other ways to do this, such as returning multiple values.
Unfortunately, I found that handling multiple values is very slow. In fact, if you cannot use the method I mentioned above (the fastest), it is much faster to construct and deconstruct a list or cons with 2 values than to process multiple values. I provide some timing below. I do not personally care if values are fast, as I have other satisfactory workarounds; it is just interesting. I didn't find any mention of it in the mailing list archives, though. These were typed at the csi prompt. ;; bare loop for timing baseline: ;; (define (q n) (if (fx= n 0) 'done (q (fx- n 1)))) ;; #;7> ,t (q 1000000) ;; 1.252 seconds elapsed ;; 6.e-03 seconds in (major) GC ;; 3 mutations ;; 1683 minor GCs ;; 5 major GCs ;; loop returning 2 values: ;; (define (t n) (if (fx= n 0) 'done (begin (##sys#call-with-values (lambda () (values 1 2)) (lambda (a b) (void))) (t (fx- n 1))))) ;; #;8> ,t (t 1000000) ;; 44.275 seconds elapsed ;; 8.196 seconds in (major) GC ;; 22000002 mutations ;; 47 minor GCs ;; 5864 major GCs ;; loop constructing and deconstructing a 2-element list: ;; (define (t n) (if (fx= n 0) 'done (begin (let* ((L (list 1 2)) (a (car L)) (b (cadr L))) (void)) (t (fx- n 1))))) ;; 3.857 seconds elapsed ;; 0.302 seconds in (major) GC ;; 2 mutations ;; 179 minor GCs ;; 219 major GCs _______________________________________________ Chicken-users mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/chicken-users
