4

Erik 的讲座第 12 章通过介绍示例函数提到了“提高空间使用率” 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

更改sumWith1sumWith2attest函数并再次作为 test2 执行。

这是分析结果: http: //pastie.org/4720019

通过查看%alloc列,我看不到这两个函数之间的任何差异。

我的问题是如何改进测试用例以找到一些差异。换句话说,是否可以分析这种情况下的空间使用情况?

谢谢你。

4

2 回答 2

6

使用 GHC 的堆分析器。

它在RWH, ch25中有详细描述。这是一个完整的例子

于 2012-09-14T14:46:54.347 回答
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 章节。

于 2012-09-14T15:27:11.743 回答