modifyIORef lazy? (was Re: BLACKHOLE in heap profile)

Hal Daume III hdaume@ISI.EDU
Fri, 18 Apr 2003 15:38:09 -0700 (PDT)


The code that I was profiling that exhibited this behavior basically
looked like:

  do t <- read a file
     r <- create an io ref
     mapM_ (\c -> do
           ...
           modifyIORef r <E>
           ) t

but when i replace:

  modifyIORef r <E>

with

  v <- readIORef r
  writeIORef r $! <E>

I no longer run into this heap problem and the program runs much more
quickly.

even if I use (modifyIORef f (\x -> id $! <E> x)), which I thought would
fix it, there is still a heap problem.

looking in the ghc sources, modifyIORef is defined as:

  modifyIORef ref f = writeIORef ref . f =<< readIORef ref

so i don't understand what's going on here.

--
 Hal Daume III                                   | hdaume@isi.edu
 "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume

On Fri, 18 Apr 2003, Hal Daume III wrote:

> My program which should use constant stack/heap is using a ton of heap.  I
> profiled with -hd and the guy that's eating all the heap is
> BLACKHOLE.  What does this mean?
> 
> --
>  Hal Daume III                                   | hdaume@isi.edu
>  "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume
> 
>