From: "kjtsanaktsidis (KJ Tsanaktsidis) via ruby-core" Date: 2024-03-14T14:12:33+00:00 Subject: [ruby-core:117170] [Ruby master Bug#20338] calling new has regressed allocations over past few ruby releases Issue #20338 has been updated by kjtsanaktsidis (KJ Tsanaktsidis). I haven���t looked at this at all myself, but it tingled my ���this is familiar��� sense. Is this the same problem as https://github.com/ruby/ruby/pull/10151 ? ---------------------------------------- Bug #20338: calling new has regressed allocations over past few ruby releases https://bugs.ruby-lang.org/issues/20338#change-107260 * Author: fablestales (Fable Tales) * Status: Open * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- Given this script: ``` class Foo def initialize(**kwargs) end end class Bar def initialize(y:) end end b = GC.stat[:total_allocated_objects] 1000.times { Foo.new(y:1) } p GC.stat[:total_allocated_objects]-b b = GC.stat[:total_allocated_objects] 1000.times { Bar.new(y:1) } p GC.stat[:total_allocated_objects]-b ``` On Ruby 3.2 it prints ``` (fable-3_3_dead_with_patches) $ ruby --version ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [arm64-darwin23] (fable-3_3_dead_with_patches) $ ruby hi.rb 3006 2005 ``` On Ruby 3.3 it prints: ``` ((HEAD detached at v3_3_0)) $ ./ruby --version ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23] ((HEAD detached at v3_3_0)) $ ./ruby hi.rb 3008 3005 ``` On master: ``` (master) $ git rev-parse HEAD 83618f2cfa004accdd1514de7dcbba291aa7e831 (master) $ ./ruby --version ruby 3.4.0dev (2024-03-14T12:33:30Z master 83618f2cfa) [arm64-darwin23] (master) $ ./ruby hi.rb 3006 4005 ``` so that is: since Ruby 3.2 `.new`ing an object with static keyword args has grown from 2 allocations per object to 4 allocations per object. I have a pull request which introduces a new instruction to the VM `opt_new` which basically inlines calling allocate and initialize directly, avoiding a lot of what is causing these extra objects to be allocated. My PR is here: https://github.com/ruby/ruby/pull/10254. With my patch the script prints 2006 and 1005 respectively. This is the smallest number of objects that _can_ be allocated for such calls. -- 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/