require 'timeout'
def do_something
Timeout::timeout(9) do
sleep 10
end
rescue Timeout::Error => e
puts "Something near line #{__LINE__} is taking too long!"
# or, count backwards in method
puts "Line #{__LINE__ - 5} is taking too long!"
end
do_something
これにより、タイムアウトブロックの時間がなくなると実行が停止し、タイムアウトエラーが発生します。実行を継続したい場合は、ベンチマークを使用した方がよい場合があります。
require 'benchmark'
time = Benchmark.realtime do
sleep 10
end
puts "Line #{__LINE__ - 2} is slow" if time > 9
1つのベンチマークブロックに複数のタイマーを含めることができます。
Benchmark.bm do |b|
b.report('sleeping:') { sleep 3 }
b.report('chomping:') { " I eat whitespace ".chomp }
end
ベンチマークの詳細については、こちらをご覧ください:http:
//ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html
実行中の行番号を追跡したい場合は、次のようなカスタムメソッドに渡してみませんか。
def timethis(line, &block)
if Benchmark.realtime(&block) > 2
puts "Line #{line} is slow"
end
end
timethis(__LINE__) { sleep 1 }