我喜欢你已经构建了您的time
方法的方式。我没有任何改进建议,但我会对相关问题说几句话。假设你想测量执行方法的时间量。有时候你可能会写些简单的东西,比如:
require 'time'
t = Time.now
rv = my_method(*args)
et = t.Time.now - t
其他时候这样不方便。例如,假设你正在构造一个数组,其元素是my_method
或my_method
的返回值,它返回一个枚举器,以便它可以链接到其他方法。
作为一个例子,我们假设你想总结一个数组的值直到遇到零。一种方法是构造一个枚举器stop_at_zero
,它从接收器中产生值,直到它遇到零,然后停止(即,引起StopIteration
例外)。然后,我们可以这样写:
arr.stop_at_zero.reduce(:+)
如果我们想知道多少时间用于执行stop_at_zero
我们可以按如下方式构建它。
class Array
def stop_at_zero
extime = Time.now
Enumerator.new do |y|
begin
each do |n|
sleep(0.5)
return y if n.zero?
y << n
end
ensure
$timings << [__method__, Time.now - extime]
end
end
end
end
我使用的begin
,ensure
,end
块以确保$timings << [__method__, Time.now - extime]
被执行时,方法返回过早。 sleep(0.5)
当然仅用于说明目的。
让我们试试吧。
$timings = []
arr = [1,7,0,3,4]
arr.stop_at_zero.reduce(:+)
#=> 8
$timings
#=> [[:stop_at_zero, 1.505672]]
$timings
将包含的含有时刻码所有方法的执行时间的历史。