【问题标题】:Is there a way using TracePoint in ruby 2.0 to get the time between call and return of methods?有没有办法在 ruby​​ 2.0 中使用 TracePoint 来获取方法调用和返回之间的时间?
【发布时间】:2013-06-02 20:49:03
【问题描述】:

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

【问题讨论】:

    标签: ruby ruby-2.0


    【解决方案1】:
    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​​ 应用程序中(很多人事先不知道),跟踪调用和返回时间更加困难(比仅设置 t0 方法更困难)。感谢您提供更多见解。
    • 哦,我没有阅读您的新编辑...您是对的,对于更复杂的情况,您需要更复杂的代码... :) 祝你好运!
    • 谢谢@deivid,可能是这样 :) 不过我需要考虑一下。您对此是否有任何已知问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2010-09-07
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多