This is the mail archive of the guile@cygnus.com mailing list for the guile project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Tel <telford@eng.uts.edu.au> writes:
> > (2) Tel's code is less memory-intensive (SZ = 3M), but slower
> > (root-test modified to take the sqrt procedure as argument)
>
> Mine needs a better initial estimate, something like what Radey was
> doing with integer-length. That should cut the iterations down.
> I'm a bit unsure about the best way to do this.
>
> > guile> (root-test 1000 square-root)
> > #t
> > ;;; 92950 msec (34280 msec in gc)
>
> The garbage collection is quite high here which puzzles me because
> I don't understand where my code is generating garbage, it just sets
> some local variables and tail-chains. The same closure should be
> holding all the local variables for all iterations. Roland stated that
> this was done with debugging turned off so it shouldn't be going into
> stack tracing. Why is it generating so much garbage?
You're code looks like this:
(define (square-root-recur C X)
(let* ((x2 (quotient (+ (quotient (+ C X -1) X) X) 2)))
(cond ((>= x2 X) X)
(else (square-root-recur C x2)))))
(define (square-root C)
(cond ((< C 0) (please-install-complex-support))
((< C 1) 0)
(else (square-root-recur C C))))
I'd think each iteration would produce garbage as follows:
(+ C X -1) - produces a new bignum
(quotient (+ C X -1) X) creates another one. 1st one is
inaccessable & thus eventually gets GCed.
Adding above to X - new bignum, prev is thrown away.
Another quotent call - another new bignum.
Comparison - should return internal #t, no garbage,
Tail call of square-root-recur - Previous value of X is thrown
away & x2 is thrown away.
So I count 4 bignums created & thrown away per iteration.
--
Harvey J. Stein
BFM Financial Research
hjstein@bfr.co.il