
Hello Haskell-Beginners, I'm having a fair amount of difficulty understanding the ST monad. In my basic experimentation I'm finding that I'm getting more heap allocated with STUArray than with a regular Array, which is not what I would expect. I've attached a sample program that attempts to sum a list of Ints into an array of length 1, using STUArray and UArray. The idea is based loosely on http://www.haskell.org/haskellwiki/Monad/ST, but using an array instead of an STRef. I compile using these arguments: ghc -fforce-recomp -O2 -prof -auto-all -caf-all --make sttest.hs When I run the ST-based function (sumInPlace1), I get the following output: ./sttest +RTS -sstderr 1784293664 240,944,212 bytes allocated in the heap 35,448 bytes copied during GC 4,052 bytes maximum residency (1 sample(s)) 12,332 bytes maximum slop 1 MB total memory in use (0 MB lost due to fragmentation) Generation 0: 459 collections, 0 parallel, 0.00s, 0.00s elapsed Generation 1: 1 collections, 0 parallel, 0.00s, 0.00s elapsed INIT time 0.00s ( 0.00s elapsed) MUT time 0.30s ( 0.31s elapsed) GC time 0.00s ( 0.00s elapsed) RP time 0.00s ( 0.00s elapsed) PROF time 0.00s ( 0.00s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 0.30s ( 0.31s elapsed) %GC time 0.8% (1.2% elapsed) Alloc rate 804,910,126 bytes per MUT second Productivity 99.0% of total user, 96.5% of total elapsed While with the Array based function (sumInPlace2), I get the following output: ./sttest +RTS -sstderr 1784293664 173,627,572 bytes allocated in the heap 22,596 bytes copied during GC 3,920 bytes maximum residency (1 sample(s)) 12,464 bytes maximum slop 1 MB total memory in use (0 MB lost due to fragmentation) Generation 0: 333 collections, 0 parallel, 0.00s, 0.00s elapsed Generation 1: 1 collections, 0 parallel, 0.00s, 0.00s elapsed INIT time 0.00s ( 0.00s elapsed) MUT time 0.14s ( 0.15s elapsed) GC time 0.00s ( 0.00s elapsed) RP time 0.00s ( 0.00s elapsed) PROF time 0.00s ( 0.00s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 0.15s ( 0.15s elapsed) %GC time 1.3% (1.9% elapsed) Alloc rate 1,200,569,571 bytes per MUT second Productivity 98.3% of total user, 94.7% of total elapsed One additional point of confusion for me: when I run either function with +RTS -hc and use hp2ps I get an empty graph. I've seen these tools work quite well before, so I suspect I'm doing something wrong now. Thanks, Chris