3

__LINE__如果花费超过 9 秒(可调整),Ruby 中有没有办法让它打印它正在处理的代码数量(在我的脚本级别,不需要 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

一个基准块可以有多个计时器:

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 回答