我看到了 ruby 非常有趣和灾难性的行为,请参见下面的代码
class ExceptionTest
def test
@result = [0]*500000
begin
no_such_method
rescue Exception => ex
puts "before #{ex.class}"
st = Time.now
ex.message
puts "after #{Time.now-st} #{ex.message}"
end
end
end
ExceptionTest.new.test
理想情况下ex.message
不应该花费任何时间来执行,因此花费的时间应该以毫秒为单位,但这是输出
before NameError
after 0.462443 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007fc74a84e4f0>
如果我分配[0]*500000
给局部变量而不是实例变量,例如result = [0]*500000
它按预期运行
before NameError
after 2.8e-05 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007ff59204e518>
看起来好像以某种方式ex.message
循环通过实例变量,为什么会这样做,请赐教!
我已经在 ruby ruby-1.9.2-p290、ruby-1.9.1-p376、ruby 2.0.0 以及 codepad.org 上的任何 ruby 版本上尝试过。