私はあなたのtime
メソッドを構築した方法が好きです。改善の提案はありませんが、私は関連する問題について少し言います。メソッドの実行に費やされた時間を測定したいとします。場合によっては、次のような単純なものを書くことができるかもしれません。
require 'time'
t = Time.now
rv = my_method(*args)
et = t.Time.now - t
他の時は便利ではありません。たとえば、戻り値がmy_method
またはmy_method
の要素を持つ配列を構築していたら、列挙子が返され、他のメソッドに連結される可能性があります。
例として、ゼロに遭遇するまで配列の値を合計したいとしましょう。これを行う1つの方法は、ゼロに遭遇するまで受信者から値を生成する列挙子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
は、私はこの方法が途中で返したときに実行される
$timings << [__method__, Time.now - extime]
を確認するために
begin
、
ensure
、
end
ブロックを使用しました。
sleep(0.5)
はもちろん説明のためだけのものです。
お試しください。
$timings = []
arr = [1,7,0,3,4]
arr.stop_at_zero.reduce(:+)
#=> 8
$timings
#=> [[:stop_at_zero, 1.505672]]
$timings
タイミングコードが含まれているすべてのメソッドの実行時間の履歴が含まれています。