From: "Eregon (Benoit Daloze) via ruby-core" Date: 2023-01-17T15:53:29+00:00 Subject: [ruby-core:111855] [Ruby master Bug#19334] Defining many instance variables and accessing them is slow in Ruby 3.2.0 Issue #19334 has been updated by Eregon (Benoit Daloze). byroot (Jean Boussier) wrote in #note-5: > IIRC Aaron mentioned that V8 use a hash table after a certain number of edges (20?). That's the complexity I'm talking about above which IMO is not worth it (that JS completely changes its object representation based on a fragile heuristic). Ruby is a proper language which doesn't confuse objects ivars and Hash pairs, so there shouldn't be a need to fallback to using a hashtable representation for ivars. An extra map/Hash per Shape to know which ivars it contains could work, but it would pretty bad for memory footprint with 1 hashtable per Shape. So it needs something more memory efficient than a hashtable per Shape. Truffle uses an Hash array mapped trie for that: https://github.com/oracle/graal/blob/master/truffle/src/com.oracle.truffle.object/src/com/oracle/truffle/object/TriePropertyMap.java Before that it used https://github.com/oracle/graal/blob/master/truffle/src/com.oracle.truffle.object/src/com/oracle/truffle/object/ConsListPropertyMap.java, which is probably similar to what CRuby does currently. I'm not sure the HAMT is needed, but that's probably the common solution to this issue. ---------------------------------------- Bug #19334: Defining many instance variables and accessing them is slow in Ruby 3.2.0 https://bugs.ruby-lang.org/issues/19334#change-101267 * 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/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/