這裏是你的程序的統計結果(我已經減少了上限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
總結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
您可以看到使用的GC數量和總內存的差異。有關更多信息,請參閱Don指出的RWH章節。
你有沒有嘗試過比較它們編譯後*沒有*優化? –
經過優化,當'test'使用'sumWith1'時,GHC會生成一個特殊的([Integer] - > Integer'類型的類型),由於嚴格性分析器知道Integer的加法是嚴格的,當使用明確嚴格的'sumWith2'時,會得到相同的代碼。 –