我试图弄清楚我是否可以获得在 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 的某种组合。我没有找到正确的键,尽管它足够独特以确保返回时间可以与调用者匹配,考虑到您可能有递归方法调用会创建非标准调用和返回情况。