![](/img/trans.png)
[英]How to install ghc and base with profiling support, in Haskell Platform
[英]How is the ghc runtime support for profiling implemented?
我在评论中找不到太多文档。 是否有任何好的博客文章或类似的文章?
关于概要分析框架的最佳信息来源仍可能是Patrick Sansom和Simon Peyton Jones的原始论文 。 其他细节可以在Sansom的博士学位论文以及后来添加正式规范的论文中找到。 西蒙·马洛(Simon Marlow)在2011年Haskell实施者研讨会上还谈到了GHC状态更新中的一些最新变化。
成本中心配置文件背后的想法是用“成本中心”节点注释表达式树,因此,例如,使用-auto-all
程序将具有如下注释:
fib n = {-# SCC foo #-} (case n of
0 -> 0
1 -> 1
n -> fib (n-1) + fib (n-2))
在运行时,输入fib
,程序将查看当前的“成本中心堆栈”,并将“ foo”添加到顶部。 一旦评估再次退出SCC注释的范围,这将被撤销。 魔确保的比特,如果,比如说, n
恰好是一个懒惰值并且该程序需要执行它的代码,成本中心适合于该代码被恢复在必要。
然后,此基础结构既用于时间分析,又用于空间分析:
计时器将定期检查成本中心堆栈。 每次找到某个成本中心堆栈时,这都被视为“滴答”。 最后,RTS将根据其滴答声的计数来估计每个成本中心堆栈的时间量,从而为您提供时间概况。
每次分配对象时,程序都会保存指向该时间点当前成本中心堆栈的指针。 这使垃圾收集器可以提供驻留的字节数的统计信息,并按分配站点进行细分。
正如评论中所要求的,关于优化的几句话:由于显而易见的原因,该框架不允许进行将非恒定成本从一个成本中心转移到另一个成本中心的优化,这迫使优化器有时会非常悲观。 例如,在上面的示例中,当前版本的GHC将无法对返回值进行拆箱,这意味着每个递归调用都会进行不必要的堆分配。
根据经验,不应指望跨 SCC注释发生的任何代码转换。 如有疑问,最好在调用堆栈中对足够高的函数进行注释,因此,对性能至关重要的位根本不会进行注释。
您可能会发现Jones,Marlow和Singh撰写的这篇论文很有用,取决于您要完成的工作。 它包括在并行上下文中对GHC程序进行概要分析的实践,并包含一些可能有用的案例研究。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.