[gambit-list] decreasing GC

Marc Feeley feeley at iro.umontreal.ca
Wed Apr 24 15:42:36 EDT 2013


On 2013-04-24, at 3:21 PM, Zhen Shen <zhenshen10 at outlook.com> wrote:

> Marc,
> 
> Sorry if my joke didn't come across as one. I am new to scheme.
> 
> If I understand you correctly, the calculations in this stmt will be performed with bignum arith?
> 
> (declare (flonum))
> (if (> x 0.01)
>   (* x a 3.0)
>   (/ x a))
> 

Certainly not bignum arithmetic, but possibly flonum arithmetic depending on your declarations.  You can verify by using the -expansion option:

% cat flo.scm
(declare (standard-bindings) (flonum) (not safe))

(if (> x 0.01) (* x a 3.0) (/ x a))
% gsc -c -expansion flo.scm
Expansion:

(if ('#<procedure #2 ##fl>> x .01)
    ('#<procedure #3 ##fl*> x a 3.)
    ('#<procedure #4 ##fl/> x a))

So here all operations are done on flonums.

> and to avoid that for max speed, i'd rewrite it as follows??
> 
> (declare (flonum))
> (define x ..)
> (define a ..)
> 
> (define p (* x a 3.0))
> (define q (/ x a))
> (define r (> x 0.01))
> (if r p q)

That will probably run slower because the test won't be inlined.  I was talking about this case:

  (let ((x (+ a b)))
    (if (< a 0.0)
        (* x x)
        (/ 1.0 x)))

Here the x will be boxed because it crosses a jump (the if).

Marc




More information about the Gambit-list mailing list