查找哪些数据类型最垃圾收集的最简单方法?

men*_*ics 7 profiling haskell

我已经仔细查看了剖析的解释,但我没有看到直接了解哪些数据类型被垃圾收集最多的方法.有没有办法做到这一点?

我们的一些代码在垃圾收集器中运行了50%甚至80%,因此......试图追踪正在使用的数据类型.

Jef*_*ter 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
Run Code Online (Sandbox Code Playgroud)

正如你从上面的示例输出中看到的,我写了一些非常糟糕的 Haskell。您可以通过一些附加选项进一步深入研究并进行改进。

  1. -prof - 启用分析
  2. -caf-all - 所有顶级项目的常量应用形式(常量成本,每个模块一个。)
  3. -auto-all - 每个顶级功能的成本中心分析

一旦你得到了分析信息,你就可以打印出漂亮的图片,如下图所示(hp2ps)。这显示了分配率。正如您从下面看到的,找到执行过多工作的函数非常简单。

各种功能分配率图

虽然这没有提供每种类型的信息,但它确实有助于隔离正在发生的情况。我发现Real World Haskell非常有用。

  • 您可以通过使用 +RTS -prof -hy -RTS 运行程序来获取类型信息。请记住,在某些版本的 GHC(特别是较新的版本)上,您可能需要在构建程序时启用 rts 选项。 (2认同)