我正在试图找出在ruby2.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的某种组合。我还没有找到正确的键,尽管这是唯一的,以确保返回时间可以匹配到调用者,考虑到您可能有创建非标准调用和返回情况的递归方法调用。
发布于 2013-06-03 09:29:40
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 @timeshttps://stackoverflow.com/questions/16887175
复制相似问题