3

9秒(調整可能)より長くかかる場合に、Rubyで__LINE__動作しているコードの数(私のスクリプトレベルでは、必須のgemではない)を出力する方法はありますか?

デバッグのために、私はそれが長時間黙って座っているのではなく、それがやろうとしていること、それがコードのどこにあるかなどの詳細な出力を出力するようにしています。

不安定な状況では、何かがタイムアウトする前にどれだけ遠くまで到達するかが予測できないため、ここでは連続した前進は適用されません。

編集

次のようなトラップのようなものが機能します。

  • 元の行番号とうまくいけばコードが記憶されます(たとえば、ベンチマークタイムアウトの両方のgemが追跡できなくなり__LINE__ます。....おそらく、スタックを操作して目的のファイルと行を含めるために、別の.rbファイルにプッシュする方法があります。 ?)
  • 残業警告が表示されても、何も変更されていないかのように実行が続行されます。
4

1 に答える 1

4
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 }
于 2012-12-03T21:59:57.150 に答える