3

我试图弄清楚我是否可以获得在 ruby​​ 2.0 中使用 TracePoint 执行方法所需的时间。任何帮助表示赞赏。


更新

我想澄清这个问题。我的目标是获得所有方法执行所需的时间,即使您不知道这些方法将是什么。我发现这很棘手。Deivid 在下面的响应涉及在共享上下文中设置 t0 和 t1 变量,然后在调用和返回时设置时间值。虽然这适用于一个简单的示例,但当尝试在更复杂的 ruby​​ 程序中记录所有方法调用的时间时,它变得难以管理。以下面的程序为例:

class C
  def self.slow
    C.fast
    sleep 3
  end

  def self.fast
  end
end

C.slow

在这个程序中,如果您跟踪被调用的方法名称,则只能监视 t0 和 t1 时间。在更复杂的程序中,例如具有许多堆栈帧的 Rails 应用程序,您事先并不知道将要执行的所有方法,因此监视和打印所有调用和返回时间的最佳方法并不明显.

解决方案“可能”涉及保留调用时间的哈希,其中键是 Thread.current.object_id 和 tp.method_id 的某种组合。我没有找到正确的键,尽管它足够独特以确保返回时间可以与调用者匹配,考虑到您可能有递归方法调用会创建非标准调用和返回情况。

4

1 回答 1

2
class C
  def self.slow n
    return C.fast if n == 0
    sleep 1
    slow n-1
  end

  def self.fast
  end
end

@times = {}

traceCall = TracePoint.new(:call, :return) do |tp|
  key = "#{tp.defined_class}_#{tp.method_id}_#{caller(0).size}"
  if tp.event == :call
    @times[key] = Time.now
  else
    @times[key] = Time.now - @times[key]
  end
end.enable do
  C.slow 3
end

p @times
于 2013-06-03T09:29:40.840 回答