有没有办法在ruby 2.0中使用TracePoint来获取调用和返回方法之间的时间?

时间:2013-06-02 20:49:04

标签: ruby ruby-2.0

我正在试图弄清楚我是否可以获得在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的某种组合。我没有找到正确的密钥虽然这是唯一足以确保考虑到您可能具有创建非标准调用和返回情况的递归方法调用,返回时间可以与调用者匹配。

1 个答案:

答案 0 :(得分: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