首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有方法在ruby2.0中使用TracePoint来获取方法调用和返回之间的时间?

有没有方法在ruby2.0中使用TracePoint来获取方法调用和返回之间的时间?
EN

Stack Overflow用户
提问于 2013-06-02 20:49:03
回答 1查看 624关注 0票数 3

我正在试图找出在ruby2.0中使用TracePoint执行方法所需的时间。任何帮助都是非常感谢的。

更新

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

代码语言:javascript
复制
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的某种组合。我还没有找到正确的键,尽管这是唯一的,以确保返回时间可以匹配到调用者,考虑到您可能有创建非标准调用和返回情况的递归方法调用。

EN

回答 1

Stack Overflow用户

发布于 2013-06-03 09:29:40

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16887175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档