我在注释中没有找到太多文档。 有没有关于这个的好博客文章或类似的东西?
-auto-all
,程序将具有以下注释:fib n = {-# SCC foo #-} (case n of
0 -> 0
1 -> 1
n -> fib (n-1) + fib (n-2))
在运行时输入 fib
时,程序会查看当前的 "成本中心堆栈",并将 "foo" 添加到顶部。一旦评估退出 SCC 注释的范围,这将被反转。一些魔法确保如果,例如,n
恰好是一个惰性值,并且程序需要执行其代码,则必要时恢复适用于 该 代码的成本中心。
然后,此基础设施用于时间和空间分析:
定时器会定期检查成本中心堆栈。每次找到某个成本中心堆栈时,这就算作一个 "tick"。最终,运行时系统将从其 tick 数计数估算每个成本中心堆栈的时间,从而提供时间分析。
每当分配对象时,程序都会保存指向那个时间点的成本中心堆栈的指针。这使得垃圾收集器能够提供一个按分配位置分解的驻留字节数统计信息。