[Haskell-cafe] Squashing space leaks

Daniel Fischer daniel.is.fischer at web.de
Fri May 6 06:33:57 EDT 2005


Am Freitag, 6. Mai 2005 02:24 schrieb Greg Buchholz:
> Josef Svenningsson wrote:
> > I think the thing that really kills you is the way you shuffle around
> > the list in the advance function. Your commented out rotations
> > function has the same problem. Here is my attempt to solve the problem
> > a little more efficiently:
>
>     We're heading in the right direction anyway.  I can now compute 1
> million iteration in about 2 minutes (with +RTS -H750M -K100M).  Well
> almost, since it now doesn't compute the right answer, so something must
> be amiss in the shuffling section.  Now if we can get it to us a little
> less than 1G of memory, we'll be in good shape.
>
> Thanks,
>
> Greg Buchholz

The problem is that a prime crept in in Josef's code,
so to calculate the positions and velocities, the updated versions of the 
planets are used, it should be

update f newlist (a:as) = a' : update f (newlist . (a:)) as
               where a' = f a (newlist as)

instead of
update f newlist (a:as) = a' : update f (newlist . (a':)) as
               where a' = f a (newlist as).

Besides, offset_momentum does not use the parameter n at all and I think that 
all the indexing in the computation of the potential energy is rather 
inefficient. I rewrote it as

myEnergy :: [Planet] -> Double
myEnergy pps@(p:ps) = kinetic - (pot pps)
   where
      kinetic = 0.5 * (sum $ map (\q -> dot (vel q) (vel q) * mass q) pps)
      pot = sum . pots
      pots [] = []
      pots (p:ps) = sum [m * (mass q) / (dist p q) | q <- ps]: pots ps
                       where
	                  m = mass p,

it didn't make it any faster, though. I did not yet space-profile

Cheers,
Daniel


More information about the Haskell-Cafe mailing list