Issue #19334 has been updated by tenderlovemaking (Aaron Patterson).
mame (Yusuke Endoh) wrote in #note-2:
I didn't explain the problem properly. The code
takes a super-linear time for the number of instance variables: 50k ivars take 3.5 sec.,
100k do 15 sec., and 200k do 60 sec. Is this intentional? I think something unexpected is
happening.
I consider this issue a hint for improvement. We should first find out what is happening
in the code. Fixing this issue may make normal code faster. If the disadvantage of fixing
it is clearly much larger than the disadvantage, we may choose not to dare to fix it. I
don't think it is a good idea to assume it's not worth fixing before you even look
into it. (Personally, I would like to see Ruby work robustly even in somewhat eccentric
cases.)
I suspect that this degradation is caused by object shapes #18776 (sorry if I am wrong).
So I would be happy if its authors, @jemmai and @tenderlovemaking, would look into it. But
if they won't do it, I will look into it myself.
Yes, we're definitely looking in to it. I'll post an update here when I have more
information 😊
----------------------------------------
Bug #19334: Defining many instance variables and accessing them is slow in Ruby 3.2.0
https://bugs.ruby-lang.org/issues/19334#change-101217
* Author: mame (Yusuke Endoh)
* Status: Open
* Priority: Normal
* Assignee: tenderlovemaking (Aaron Patterson)
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
```
class C
eval("def initialize; #{ (0..100000).map { "@x#{ _1 } = 0; " }.join }
end")
attr_reader :x50000
end
p :start
C.new.x50000
```
This script takes less than one second in Ruby 3.1.3, and does more than ten second in
Ruby 3.2.0.
```
$ time ruby -v test.rb
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]
:start
real 0m0.210s
user 0m0.167s
sys 0m0.044s
```
```
$ time ruby -v test.rb
ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-linux]
:start
real 0m11.026s
user 0m10.950s
sys 0m0.040s
```
This problem is not critical, but is there any room for improvement?
--
https://bugs.ruby-lang.org/