如何阅读ruby profiler的输出

时间:2015-08-25 19:58:51

标签: ruby profiling profiler

让我们以docs

为例
require 'profile'

def slow_method
  5000.times do
    9999999999999999*999999999
  end
end

def fast_method
  5000.times do
    9999999999999999+999999999
  end
end

slow_method
fast_method

输出:

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 68.42     0.13      0.13        2    65.00    95.00  Integer#times
 15.79     0.16      0.03     5000     0.01     0.01  Fixnum#*
 15.79     0.19      0.03     5000     0.01     0.01  Fixnum#+
  0.00     0.19      0.00        2     0.00     0.00  IO#set_encoding
  0.00     0.19      0.00        1     0.00   100.00  Object#slow_method
  0.00     0.19      0.00        2     0.00     0.00  Module#method_added
  0.00     0.19      0.00        1     0.00    90.00  Object#fast_method
  0.00     0.19      0.00        1     0.00   190.00  #toplevel
  • % time是花在这些方法上的时间。
  • cumulative seconds是之前的cumulative secondsself seconds,即0 + 0.13 = 0.130.13 + 0.03 = 0.160.16 + 0.03 = 0.19,等等。
  • self seconds以秒计算% time
  • calls表示调用此方法的次数。
  • self ms/callself seconds / calls
  • 什么是total ms/call

2 个答案:

答案 0 :(得分:2)

tl; dr self seconds +在被调用方法中花费的时间

好的,让我们深入研究source。有两个proc,在那里收集信息:PROFILE_CALL_PROCPROFILE_RETURN_PROC。前者在进入方法之前被调用,后者在步入之前被调用。

@@maps[Thread.current]以此特定顺序累积有关方法的信息,即callstotal secondscost),self secondsname。这些信息稍后以更加冗长的方式提供给用户。在aggregated之后。

@@stacks[Thread.current]在堆栈中存储有关正在运行的方法的信息。即“当方法开始时”,“所谓的(子)方法花了多少时间”(tick[1])。这更像是一个临时数据结构,旨在帮助将数据收集到@@maps

正如人们可以看到的那样,self secondstotal seconds减去cost(在被叫方法中花费的时间)。也就是说,total seconds是在方法本身和它调用的方法中花费的时间。

P.S。几乎在ruby-prof中提醒flat profiles

答案 1 :(得分:0)

方法可能会花费时间,或者花费时间,因为它调用的方法花费的时间。 self ms/call仅计算前者,而total ms/call计算两者的总和。代表self seconds而不是total seconds是有道理的,因为这样可以在整个地方累积。