【问题标题】:Simplest way to find which data types are most garbage collected?查找哪些数据类型被垃圾收集最多的最简单方法?
【发布时间】:2011-07-21 14:06:07
【问题描述】:

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

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

【问题讨论】:

    标签: haskell profiling


    【解决方案1】:

    对于分析,您可以在运行应用程序时向应用程序添加很多选项。首先你可以添加“+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。您可以通过一些额外的选项来深入研究这一点并进行改进。

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

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

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

    【讨论】:

    • 您可以通过使用 +RTS -prof -hy -RTS 运行程序来获取类型信息。请记住,在某些 GHC 版本(尤其是较新的版本)上,您可能需要在构建程序时启用 rts 选项。
    • -hy 似乎是我想要的,除了......它谈到:“实时堆与时间的关系图”,但这不是我想要的。我不想知道堆大小,我想知道有多少(以及什么类型)正在创建的垃圾不会保留在堆上。
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多