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

标签 haskell profiling

我环顾了一下分析的解释,但我没有看到一种方法可以直接了解哪些数据类型被垃圾收集最多。有没有办法做到这一点?

我们的一些代码在垃圾收集器中运行了 50% 甚至 80%,所以......试图追踪哪些数据类型正在被垃圾处理。

最佳答案

对于分析,您可以在运行时向应用程序添加相当多的选项。首先你可以添加“+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。您可以通过一些额外的选项深入研究这一点并进行改进。
  • -prof - 启用分析
  • -caf-all - 所有顶级项目的常量应用表格(固定成本,每个模块一个。)
  • -auto-all - 每个顶级功能的成本中心分析

  • 获取分析信息后,您可以打印出如下图所示的漂亮图片(hp2ps)。这显示了分配率。正如您从下面看到的那样,找到工作量太大的函数非常简单。

    Picture of the allocation rate of various functions

    虽然这没有给出每种类型的信息,但它确实有助于隔离正在发生的事情。我找到了Real World Haskell非常有用。

    关于haskell - 查找哪些数据类型被垃圾收集最多的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410345/

    相关文章:

    serialization - Data.Vector.Binary 与 Binary [a] 实例重叠

    c - 相同(重复)代码的时钟周期值不同

    c++ - gprof 输出问题

    python - 测量在 python 进程中调用的 C 库的覆盖率

    java - 如何找出哪种方法花费了很多时间?

    haskell - 创建一个打印并返回值的 haskell 函数

    haskell - Haskell 中使用无穷列表的毕达哥拉斯三元组

    haskell - yesod 如何解决这个错误?

    scala - 从 Scala 中的字符串读取案例类对象(类似于 Haskell 的 "read"类型类)

    c# - 是否可以直接从 C# 使用 Profiling API?