[Larceny-users] profiling spirales

William D Clinger will at ccs.neu.edu
Mon Feb 16 12:25:39 EST 2009


Eduardo Cavazos wrote:
> Yes, I was quite surprised to see bignum related procedures in the
> profile reports.

That was probably a performance bug in Larceny.  (See below.)

> Eh... I know that it's good to avoid bignum arithmetic where possible.
> But I didn't know that using exact numbers (i.e. integer literals) will
> throw Larceny into "bignum mode". Isn't there a middle ground for fixnums?

If x is an inexact real (flonum), then (exact x) is an exact
rational whose computation generally involves bignum arithmetic,
because IEEE double precision numbers have a 53-bit significand.

If x is an inexact integer in the fixnum range, however, then
Larceny could recognize that special case and avoid the bignum
arithmetic.  Larceny wasn't recognizing that special case.  As
of changeset:6062, it does.  That special case is now over
twice as fast as the general case.

For your program, you have to convert the inexact results of
a computation into the exact coordinates of a pixel.  If you
round the inexact results before you convert them to exact,
then you are exercising the special case.

> So to be sure, are you saying that if I have a literal '1' in my
> code, I should change it to '0.0'?

More likely to '1.0', but you have to be careful.  If the
constant is an input to a calculation using inexact numbers,
then the constant should be inexact.  If the constant is an
input to a calculation that should use exact numbers, then
the constant should be exact.

You had remarked earlier that "it's no fun to litter the
code with" exact->inexact, but you may need to do some of
that to avoid unnecessary mixed-mode arithmetic, which is
expensive.  On the other hand, it may be that all of the
bignum arithmetic was coming from Larceny's failure to
recognize the special case; if so, then the change I just
made will eliminate the bignum arithmetic.

Will



More information about the Larceny-users mailing list