Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell ghc运行时对评测的支持是如何实现的?_Haskell_Profiling_Ghc - Fatal编程技术网

Haskell ghc运行时对评测的支持是如何实现的?

Haskell ghc运行时对评测的支持是如何实现的?,haskell,profiling,ghc,Haskell,Profiling,Ghc,我在评论中没有找到太多的文档。这方面有什么好的博文或类似的文章吗?你可能会发现琼斯、马洛和辛格的文章很有用,这取决于你想完成什么。它包括在并行环境中评测GHC程序的实践,并包含一些您可能会发现有用的案例研究。评测框架的最佳信息来源可能仍然是Patrick Sansom和Simon Peyton Jones的。更多细节可以在Sansom以及添加正式规范中找到。Simon Marlow还谈到了GHC状态更新中最近的一些变化 成本中心分析背后的思想是用“成本中心”节点注释表达式树,因此,例如,使用-a

我在评论中没有找到太多的文档。这方面有什么好的博文或类似的文章吗?

你可能会发现琼斯、马洛和辛格的文章很有用,这取决于你想完成什么。它包括在并行环境中评测GHC程序的实践,并包含一些您可能会发现有用的案例研究。

评测框架的最佳信息来源可能仍然是Patrick Sansom和Simon Peyton Jones的。更多细节可以在Sansom以及添加正式规范中找到。Simon Marlow还谈到了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注释中发生任何代码转换。如果有疑问,最好在调用堆栈中对足够高的函数进行注释,这样性能关键位就根本不会被注释。

    在一次相对徒劳的谷歌搜索之后,恐怕GHC HQ正忙于实现和改进它,以至于无法在博客上对其进行描述。我认为大部分仍然与本文中描述的差不多。你有什么特别感兴趣的吗?谢谢你的推荐!这应该是一个答案。我认为rwh提到一些优化与评测不兼容