在进行性能分析时,累加被调用函数的执行时间到调用者的执行时间,有什么正确(或好的)方法?

在对递归函数进行性能分析时,如何将子函数调用花费的时间累加到它们的父函数中变得复杂。如果你分析下面的 Lua 代码:

function a(n)
  wait(10)
  if n > 0 then
    a(n-1)
  end
end

a(1)

并且,为了分析,只有 wait(10) 一行代码耗费时间,那么应该将多少子函数时间归因于 a(n-1) 行?

一个好的分析 profile 应该满足以下两个属性:

  1. 函数的子函数时间应该是其行的子函数时间的总和(对于自身时间也是如此)
  2. 一行代码所花费的自身时间和子函数时间之和应该等于你用 os.clock()(或等价函数)包装该行所测得的时间。

如果 a(n-1) 的子函数时间为 0,则满足 (1) 而不满足 (2)。如果 a(n-1) 的子函数时间为 10,则满足 (2) 而不满足 (1)。

我看了一篇关于 gprof 的论文,但可能没看懂。据我所知,他们认为这是个棘手的问题,他们的解决方案会让 a(n-1) 的子函数时间为 0。我不确定在 a() 调用 b() 调用 a() 的情况下会发生什么。

有人了解 0 或 10 哪个更好,以及为什么吗?或者,更好的是,有其他解决方案来同时满足(1)和(2)吗?

原文链接 https://stackoverflow.com/questions/5864023

点赞
stackoverflow用户280314
stackoverflow用户280314

这篇由 Graham、Kessler 和 McCusick 撰写的关于 gprof 的论文(点击此处阅读)描述了:

  • gprof 的概况
  • 循环检测及针对循环的时间传播方法
2011-05-03 06:37:11