Lecture chapter 12 by Erik通过引入示例函数sumWith
来提及“改善空间使用”。
我代表懒惰版和严格版,如下所示。
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]
我认为严格版本应该在一定程度上提高性能 我尝试验证杠杆GHC分析工具。
$ ghc --make -O2 -prof -auto-all -rtsopts -o test1
$ ./test1 +RTS -p -RTS
在sumWith1
函数下将sumWith2
更改为test
,然后再次执行test2。
以下是分析结果:http://pastie.org/4720019。
通过查看%alloc
列,我看不出这两个函数之间的差异。
我的问题是如何改进测试用例以找到一些区别。 换句话说,是否可以为这种情况分析空间使用情况?
谢谢。
答案 0 :(得分:6)
使用GHC的堆分析器。
在RWH, ch25中详细描述。这是a fully worked example。
答案 1 :(得分:4)
以下是您的计划统计数据(我已将上限减少到1000000)
这是你修改过的程序
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]
使用ghc -prof -fprof-auto -rtsopts heap.hs
对于sumwith1
./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
对于sumwith2
./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
您可以看到GC数量和使用的总内存之间的巨大差异。有关更多信息,请参阅Don指出的RWH章节。