Space Profiling

"Benjamin Fraser" <[email protected]> Tue, 10 May 2005 22:19:55 +1000
Newsgroups gmane.comp.lang.haskell.nhc.user
Message-ID <[email protected]>
Hello,

I wanted to use nhc to profile a simple program but ran into a string of =

errors. The example I present here is one of four small programs I have =
played
with. This example is from nhc98-1.18 compilied from source, I have =
played with
the 1.18 and 1.16 binary versions also. I'm using debian 3. The program =
is:

#####################strict.hs
module Main where

foldl' f e [] =3D e
foldl' f e (x:xs) =3D (foldl' f $! f e x) xs

main =3D print $ foldl' (+) 0 [1..1000]
{-main =3D print $ foldr (+) 0 [1..1000]-}
#####################strict.hs

With the aim of showing strict.hs would run in constant space as =
compared to
the commented out version. I compilied and ran the program thus (I know =
I can
use hmake instead):

$ nhc98 -p -o strict strict.hs

$ ./strict +RTS -p -i25kb -RTS
500500

$ hp2graph strict.hp
Illegal token JOB at 69
Aborted

This is the most common error encountered. Try again:

$ ./strict +RTS -p -i24kb -RTS
500500

$ hp2graph strict.hp
Segmentation fault

Segmentation faults are the second most common error. It is also =
possible for=20
hp2graph to run without error but it produces invalid postscript that =
cannot=20
be viewed. Here are the strict.hp files from each run:

#####################strict 25kb interval
JOB ./strict +RTS -p -i25kb -RTS ;
DATE "Tue May 10 21:45:49 2005
"
PROFILE_PRODUCER
MARK     0.00
SAMPLE 0     0.00
  	344
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 1     0.00
  	356
  <binary_int_op>	8
  <APPLY>	80
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 2     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 3     0.00
  	344
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 4     0.00
  	356
  <binary_int_op>	8
  <APPLY>	80
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 5     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 6     0.00
  	344
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 7     0.00
;
#####################strict 25kb interval

#####################strict 24kb interval
JOB ./strict +RTS -p -i24kb -RTS ;
DATE "Tue May 10 21:46:40 2005
"
PROFILE_PRODUCER
MARK     0.00
SAMPLE 0     0.00
  	328
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 1     0.00
  	328
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 2     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 3     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 4     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 5     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 6     0.00
  	328
  <binary_int_op>	8
  <APPLY>	72
  <Main>	8
  Builtin.primIntFromInteger	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 7     0.00
  	544
  IO.hPutChar:7:30-7:52	12
  <APPLY>	56
  <Main>	8
  Prelude.primIntegerAdd	8
;
MARK     0.00
SAMPLE 8     0.00
;
#####################strict 24kb interval

What am I doing wrong, some option perhaps?

Thanks,
Ben Fraser