Bug #8366

Exception.message take time to execute depending on the instance variables

Added by anurag uniyal 12 months ago. Updated 12 months ago.

[ruby-core:54767]
Status:Open
Priority:Low
Assignee:-
Category:-
Target version:-
ruby -v:ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.4.2] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

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.

History

#2 Updated by Nobuyoshi Nakada 12 months ago

You can see the reason by reducing the size of the instance variable.

#3 Updated by anurag uniyal 12 months 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#tos (https://github.com/ruby/ruby/blob/ruby200/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?

#4 Updated by Nobuyoshi Nakada 12 months ago

  • Priority changed from High to Low

You should define inspect method.

#5 Updated by anurag uniyal 12 months 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

Also available in: Atom PDF