Feature #8366
openException.message take time to execute depending on the instance variables
Description
I am seeing very interesting and catastrophic behavior with ruby, see the code below
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
Ideally ex.message should not take any time to execute and hence Time taken should be in ms, but here is the output
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.4.2]
before NameError
after 0.462443 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007fc74a84e4f0>
If I assign [0]*500000
to a local variable instead of instance variable e.g. result = [0]*500000
it runs as expected
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.4.2]
before NameError
after 2.8e-05 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007ff59204e518>
It looks like somehow ex.message
is looping thru the instance variables, why it would do so, please enlighten me!
I have tried it on ruby ruby-1.9.2-p290, ruby-1.9.1-p376 and whatever version the ruby on codepad.org is.
Updated by anuraguniyal (anurag uniyal) over 11 years ago
also tried with ruby 2.0.0 at http://www.compileonline.com/execute_ruby_online.php
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
You can see the reason by reducing the size of the instance variable.
Updated by anuraguniyal (anurag uniyal) over 11 years ago
nobu (Nobuyoshi Nakada) wrote:
You can see the reason by reducing the size of the instance variable.
What do you mean? I have a big project where I load plugins and each plugin can have megabytes of data and if one plugin does not implement some method, ex.message just hangs, other than that this is huge development nightmare when a typo in code can make scripts hang
It is a bug in NameError#to_s (https://github.com/ruby/ruby/blob/ruby_2_0_0/error.c#L1088-L1095) because it calls obj.inspect and which can be huge and time consuming for objects which have huge instance variables, doesn't Ruby support large instance variables?
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Priority changed from 5 to 3
You should define inspect method.
Updated by anuraguniyal (anurag uniyal) over 11 years ago
nobu (Nobuyoshi Nakada) wrote:
You should define inspect method.
But it is not practical to define inspect on all the classes I write or add inspect to all third party code or plugins I use, easier and better solution would be to now have obj.inspect called for ex.message
Updated by Glass_saga (Masaki Matsushita) almost 10 years ago
- Category set to core
- Status changed from Open to Closed
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN to 1.9.3: DONTNEED, 2.0.0: DONTNEED
It can't be reproduced with ruby 2.1.3.
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux]
before NameError
after 0.147735733 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007fac810bed90>
Updated by nobu (Nobuyoshi Nakada) almost 10 years ago
- Tracker changed from Bug to Feature
- Status changed from Closed to Open