让我们以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 seconds
加self seconds
,即0 + 0.13 = 0.13
,0.13 + 0.03 = 0.16
,0.16 + 0.03 = 0.19
,等等。self seconds
以秒计算% time
。calls
表示调用此方法的次数。self ms/call
为self seconds
/ calls
。total ms/call
?答案 0 :(得分:2)
tl; dr self seconds
+在被调用方法中花费的时间
好的,让我们深入研究source。有两个proc
,在那里收集信息:PROFILE_CALL_PROC
,PROFILE_RETURN_PROC
。前者在进入方法之前被调用,后者在步入之前被调用。
@@maps[Thread.current]
以此特定顺序累积有关方法的信息,即calls
,total seconds
(cost
),self seconds
和name
。这些信息稍后以更加冗长的方式提供给用户。在aggregated之后。
@@stacks[Thread.current]
在堆栈中存储有关正在运行的方法的信息。即“当方法开始时”,“所谓的(子)方法花了多少时间”(tick[1]
)。这更像是一个临时数据结构,旨在帮助将数据收集到@@maps
。
正如人们可以看到的那样,self seconds
是total seconds
减去cost
(在被叫方法中花费的时间)。也就是说,total seconds
是在方法本身和它调用的方法中花费的时间。
P.S。几乎在ruby-prof
中提醒flat profiles。
答案 1 :(得分:0)
方法可能会花费时间,或者花费时间,因为它调用的方法花费的时间。 self ms/call
仅计算前者,而total ms/call
计算两者的总和。代表self seconds
而不是total seconds
是有道理的,因为这样可以在整个地方累积。