gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:44 26 4
gpt4 key购买 nike

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

最佳答案

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

关于ruby - 有没有办法在 ruby​​ 2.0 中使用 TracePoint 来获取方法调用和返回之间的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16887175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com