我已经仔细查看了分析的解释,但我没有看到直接了解哪些数据类型被垃圾收集最多的方法。有没有办法做到这一点?
我们的一些代码在垃圾收集器中运行了50%甚至80%,因此......试图找出正在被攻击的数据类型。
答案 0 :(得分:3)
对于分析,您可以在运行时为应用添加相当多的选项。首先,您可以添加“+ RTS -sstderr”。这为您提供了您所描述的广泛统计数据,因此我猜您已经知道了这一点!
1,835,837,744 bytes allocated in the heap
328,944,448 bytes copied during GC
2,908,728 bytes maximum residency (25 sample(s))
142,056 bytes maximum slop
9 MB total memory in use (1 MB lost due to fragmentation)
Generation 0: 3483 collections, 0 parallel, 1.54s, 1.54s elapsed
Generation 1: 25 collections, 0 parallel, 0.09s, 0.07s elapsed
INIT time 0.00s ( 0.00s elapsed)
MUT time 3.04s ( 3.13s elapsed)
GC time 1.63s ( 1.61s elapsed)
RP time 0.00s ( 0.00s elapsed)
PROF time 0.00s ( 0.00s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 4.67s ( 4.74s elapsed)
%GC time 34.9% (34.0% elapsed)
Alloc rate 603,893,994 bytes per MUT second
Productivity 65.1% of total user, 64.2% of total elapsed
从上面的示例输出中可以看出,我写了一些非常糟糕的Haskell。您可以通过一些额外的选项深入研究这一点并改进。
一旦获得分析信息,您就可以打印出如下图所示的漂亮图片(hp2ps)。这显示了分配率。从下面可以看出,找到功能太多的功能非常简单。
虽然这并没有提供每种类型的信息,但它确实有助于隔离正在发生的事情。我发现Real World Haskell非常有用。