2012-09-14 78 views
4

Lecture chapter 12 by Erik通過引入示例函數sumWith來提及「改善空間使用率」。是否可以分析Haskell中的空間使用情況

我代表懶惰版本和嚴格版本如下。

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 

變化sumWith1sumWith2test功能,並再次爲test2的執行。

以下是性能分析結果:http://pastie.org/4720019

通過查看%alloc列,我沒有看到這兩個函數之間的任何差異。

我的問題是我應該如何改進測試用例才能找到一些區別。 換句話說,是否可以分析這種情況下的空間使用情況?

謝謝。

+0

你有沒有嘗試過比較它們編譯後*沒有*優化? –

+1

經過優化,當'test'使用'sumWith1'時,GHC會生成一個特殊的([Integer] - > Integer'類型的類型),由於嚴格性分析器知道Integer的加法是嚴格的,當使用明確嚴格的'sumWith2'時,會得到相同的代碼。 –

回答

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 

總結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章節。

+0

謝謝Satvik。我將從RWH章節中挖掘更多。 – Simon

相關問題