Is it possible to profile space usage in Haskell

In chapter 12 of Eric’s lecture, he mentions “improving the use of space” by introducing the sumWith function sumWith .

I present both the lazy version and the strict version, as shown below.

 sumWith1 v [] = v sumWith1 v (x:xs) = sumWith1 (v+x) xs sumWith2 v [] = v sumWith2 v (x:xs) = (sumWith2 $! (v+x)) xs test = sumWith1 0 [1..200000000] 

I suggest that a strict version should improve performance at a certain level, so I'm trying to test the GHC profiling tool.

 $ ghc --make -O2 -prof -auto-all -rtsopts -o test1 $ ./test1 +RTS -p -RTS 

Change sumWith1 to sumWith2 to test and run again as test2.

Here is the profiling result: http://pastie.org/4720019 .

Looking at the %alloc column, I see no difference between the two functions.

My question is how to improve the test case to find some kind of difference. In other words, is it possible to profile the use of space for such a case?

Thanks.

+4
source share
2 answers

Here are the statistics for your program (I reduced the upper limit to 1,000,000)

Here is your little modified program

 sumWith1 v [] = v sumWith1 v (x:xs) = sumWith1 (v+x) xs sumWith2 v [] = v sumWith2 v (x:xs) = (sumWith2 $! (v+x)) xs main = print $ sumWith1 0 [1..1000000] 

Compiling with ghc -prof -fprof-auto -rtsopts heap.hs

In total 1

 ./heap +RTS -sstderr -K500M 500000500000 266,384,496 bytes allocated in the heap 367,442,520 bytes copied during GC 117,747,616 bytes maximum residency (8 sample(s)) 1,931,472 bytes maximum slop 196 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 393 colls, 0 par 0.19s 0.19s 0.0005s 0.0455s Gen 1 8 colls, 0 par 0.20s 0.21s 0.0257s 0.0832s INIT time 0.00s ( 0.00s elapsed) MUT time 0.15s ( 0.16s elapsed) GC time 0.39s ( 0.39s 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.55s ( 0.55s elapsed) %GC time 71.2% (71.5% elapsed) Alloc rate 1,689,230,189 bytes per MUT second Productivity 28.7% of total user, 28.7% of total elapsed 

In total 2

 ./heap +RTS -sstderr -K500M 500000500000 256,057,488 bytes allocated in the heap 65,256 bytes copied during GC 30,240 bytes maximum residency (1 sample(s)) 21,440 bytes maximum slop 1 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 488 colls, 0 par 0.00s 0.00s 0.0000s 0.0000s Gen 1 1 colls, 0 par 0.00s 0.00s 0.0003s 0.0003s INIT time 0.00s ( 0.00s elapsed) MUT time 0.14s ( 0.14s 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.14s ( 0.14s elapsed) %GC time 1.8% (1.8% elapsed) Alloc rate 1,798,840,354 bytes per MUT second Productivity 98.0% of total user, 99.3% of total elapsed 

You can see a significant difference in the sum of the GC and the total memory used. For more information, you can refer to the RWH chapter, as Don pointed out.

+4
source

Use the GHC heap profiler.

Described in detail in RWH, ch25 . Here is a fully processed example .

+6
source

Source: https://habr.com/ru/post/1434213/


All Articles