如何读取 sbcl 确定性分析器输出?

How to read sbcl deterministic profiler output?

如何解释 deterministic profiler of sbcl 的输出?

  seconds  |     gc     |   consed  | calls |  sec/call  |  name
-------------------------------------------------------       

seconds(总执行时间),calls(总调用量),sec/call(每次调用的平均时间),name(以及功能)非常简单。 consedgc是什么意思?

我猜 consed 告诉分配的内存(虽然在什么单位?)我会说 gc 告诉 gc 回收的单位数量,但这两个值永远不匹配并且甚至使用不同的表示方案(gc 每 3 个数字有一个 . 并且有一个 , .

例如这个示例输出会告诉我什么(如果我的猜测是正确的,我会发生大量内存泄漏):

  seconds  |     gc     |   consed  | calls |  sec/call  |  name
-------------------------------------------------------     
     0.011 |      0.000 |   965,488 |     6 |   0.001817 | PACKAGE:NAME
-------------------------------------------------------
     0.011 |      0.000 |   965,488 |     6 |             | Total

如果您熟悉 SBCL(缩写)下 (free …) 的输出,这些列将更容易解释:

Evaluation took:
  0.771 seconds of real time
  [ Run times consist of 0.061 seconds GC time, and 0.639 seconds non-GC time. ]
  166,575,680 bytes consed

在您的示例中,package:name 位于调用堆栈顶部(仅在分析函数中)达 0.011 秒,GC 没有影响它,因为它在这段时间内从未发生过或太快了,并且分配了 965488 字节的 SBCL 管理内存。

每次 GC 后已使用和未使用的内存量无法按函数细分,因为未跟踪此信息。您可以通过评估前后的 (sb-ext:gc :full t) (room) 来衡量总体内存消耗,但请注意,报告的数量略有波动,并且不包括外部代码(C 库,如果您的应用程序使用它们)分配的内存,最后REPL 中的三个结果和表达式是 retained.