ruby-core

Mailing list archive

[#111121] [Ruby master Bug#19165] Method (with no param) delegation with *, **, and ... is slow — "matsuda (Akira Matsuda)" <noreply@...>

Issue #19165 has been reported by matsuda (Akira Matsuda).

9 messages 2022/12/01

[#111135] [Ruby master Bug#19167] Object#inspect does not correctly show NilClass TrueClass and FalseClass stored in instance variables — "tompng (tomoya ishida)" <noreply@...>

Issue #19167 has been reported by tompng (tomoya ishida).

7 messages 2022/12/01

[#111183] [Ruby master Misc#19178] How does CRuby handle CVE issues in stdlib gems which get patched? — "Segaja (Andreas Schleifer)" <noreply@...>

Issue #19178 has been reported by Segaja (Andreas Schleifer).

14 messages 2022/12/03

[#111220] [Ruby master Bug#19187] Ruby 3.1.3 testsuite fails after timezone 2022g update is applied — "coolo (Stephan Kulow)" <noreply@...>

Issue #19187 has been reported by coolo (Stephan Kulow).

11 messages 2022/12/06

[#111264] [Ruby master Feature#19197] Add Exception#root_cause — "AMomchilov (Alexander Momchilov)" <noreply@...>

Issue #19197 has been reported by AMomchilov (Alexander Momchilov).

8 messages 2022/12/12

[#111272] [Ruby master Bug#19231] Integer#step and Float::INFINITY - inconsistent behaviour when called with and without a block — "andrykonchin (Andrew Konchin)" <noreply@...>

Issue #19231 has been reported by andrykonchin (Andrew Konchin).

7 messages 2022/12/13

[#111279] [Ruby master Bug#19233] Failed to install sqlite3 gem since 7f1ca666424849134990d022266bcd4d6636465f using Docker — "yahonda (Yasuo Honda)" <noreply@...>

Issue #19233 has been reported by yahonda (Yasuo Honda).

9 messages 2022/12/14

[#111306] [Ruby master Feature#19236] Allow to create hashes with a specific capacity from Ruby — "byroot (Jean Boussier)" <noreply@...>

Issue #19236 has been reported by byroot (Jean Boussier).

15 messages 2022/12/15

[#111318] [Ruby master Misc#19240] DevMeeting-2023-01-19 — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #19240 has been reported by mame (Yusuke Endoh).

14 messages 2022/12/16

[#111339] [Ruby master Feature#19245] Strict mode for Array#pack that doesn't silently truncate numbers that are too large for the given directive — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #19245 has been reported by byroot (Jean Boussier).

8 messages 2022/12/20

[#111342] [Ruby master Bug#19246] Rebuilding the loaded feature index much slower in Ruby 3.1 — "thomthom (Thomas Thomassen) via ruby-core" <ruby-core@...>

Issue #19246 has been reported by thomthom (Thomas Thomassen).

22 messages 2022/12/20

[#111361] [Ruby master Bug#19248] TestGCCompact#test_moving_objects_between_size_pools test failure — "vo.x (Vit Ondruch) via ruby-core" <ruby-core@...>

Issue #19248 has been reported by vo.x (Vit Ondruch).

25 messages 2022/12/21

[#111400] [Ruby master Bug#19254] Enabling YJIT configuration option breaks rspec-core test suite — "vo.x (Vit Ondruch) via ruby-core" <ruby-core@...>

Issue #19254 has been reported by vo.x (Vit Ondruch).

7 messages 2022/12/23

[#111448] [Ruby master Bug#19266] URI::Generic should use URI::RFC3986_PARSER instead of URI::DEFAULT_PARSER — "gareth (Gareth Adams) via ruby-core" <ruby-core@...>

Issue #19266 has been reported by gareth (Gareth Adams).

9 messages 2022/12/26

[#111456] [Ruby master Bug#19271] irb ignores rbs and debug with YJIT enabled — "olivierlacan (Olivier Lacan) via ruby-core" <ruby-core@...>

Issue #19271 has been reported by olivierlacan (Olivier Lacan).

9 messages 2022/12/27

[#111461] [Ruby master Feature#19272] Hash#merge: smarter protocol depending on passed block arity — "zverok (Victor Shepelev) via ruby-core" <ruby-core@...>

Issue #19272 has been reported by zverok (Victor Shepelev).

9 messages 2022/12/27

[#111465] [Ruby master Bug#19273] [Regexp] regexp does not does not match expected — "taichi730 (Taichi Ishitani) via ruby-core" <ruby-core@...>

Issue #19273 has been reported by taichi730 (Taichi Ishitani).

8 messages 2022/12/28

[#111477] [Ruby master Bug#19275] Bundled gems extensions are not installed with 3.2.0 release tarball — "xtkoba (Tee KOBAYASHI) via ruby-core" <ruby-core@...>

Issue #19275 has been reported by xtkoba (Tee KOBAYASHI).

8 messages 2022/12/28

[#111480] [Ruby master Misc#19276] It is not possible to reply to emails from rubymine — "graywolf (Gray Wolf) via ruby-core" <ruby-core@...>

Issue #19276 has been reported by graywolf (Gray Wolf).

8 messages 2022/12/28

[#111484] [Ruby master Bug#19278] Constructing subclasses of Data with positional arguments — "tenderlovemaking (Aaron Patterson) via ruby-core" <ruby-core@...>

Issue #19278 has been reported by tenderlovemaking (Aaron Patterson).

16 messages 2022/12/28

[#111485] [Ruby master Bug#19279] Allow `Coverage.supported?` to recognize oneshot lines mode — "kevin-j-m (Kevin Murphy) via ruby-core" <ruby-core@...>

SXNzdWUgIzE5Mjc5IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGtldmluLWotbSAoS2V2aW4gTXVycGh5

7 messages 2022/12/28

[#111526] [Ruby master Bug#19288] Ractor JSON parsing significantly slower than linear parsing — "maciej.mensfeld (Maciej Mensfeld) via ruby-core" <ruby-core@...>

Issue #19288 has been reported by maciej.mensfeld (Maciej Mensfeld).

24 messages 2022/12/30

[#111529] [Ruby master Bug#19289] RbConfig::CONFIG["STRIP"] should keep `rb_abi_version` and `rb_abi_version` should always be part of Ruby — "Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>

Issue #19289 has been reported by Eregon (Benoit Daloze).

8 messages 2022/12/30

[ruby-core:111124] [Ruby master Bug#19165] Method (with no param) delegation with *, **, and ... is slow

From: "matsuda (Akira Matsuda)" <noreply@...>
Date: 2022-12-01 08:55:59 UTC
List: ruby-core #111124
Issue #19165 has been updated by matsuda (Akira Matsuda).





FYI for confirming "five Array objects and two Hash objects" that I wrote a=
bove, I used ko1's allocation_tracer as follows:



```

require 'allocation_tracer'



ObjectSpace::AllocationTracer.setup([:type])

o.foo_with_triple_dots

pp ObjectSpace::AllocationTracer.trace {

  o.foo_with_triple_dots

}

```



----------------------------------------

Bug #19165: Method (with no param) delegation with *, **, and ... is slow

https://bugs.ruby-lang.org/issues/19165#change-100398



* Author: matsuda (Akira Matsuda)

* Status: Open

* Priority: Normal

* ruby -v: ruby 3.2.0dev (2022-12-01T08:05:41Z master 4e68b59431) +YJIT [ar=
m64-darwin21]

* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN

----------------------------------------

I found that method delegation via Forwardable is much slower than normal m=
ethod call when delegating a method that does not take parameters.



Here's a benchmark that explains what I mean.



```

require 'forwardable'

require 'pp'

require 'benchmark/ips'



class Obj

  extend Forwardable



  attr_accessor :other



  def initialize

    @other =3D Other.new

  end



  def foo_without_splat

    @other.foo

  end



  def foo_with_splat(*)

    @other.foo(*)

  end



  def foo_with_splat_with_name(*args)

    @other.foo(*args)

  end



  def foo_with_splat_and_double_splat(*, **)

    @other.foo(*, **)

  end



  def foo_with_triple_dots(...)

    @other.foo(...)

  end



  delegate :foo =3D> :@other

end



class Other

  def foo() end

end



o =3D Obj.new



Benchmark.ips do |x|

  x.report 'simple call' do

    o.other.foo

  end



  x.report 'delegate without splat' do

    o.foo_without_splat

  end



  x.report 'delegate with splat' do

    o.foo_with_splat

  end



  x.report 'delegate with splat with name' do

    o.foo_with_splat_with_name

  end



  x.report 'delegate with splat and double splat' do

    o.foo_with_splat_and_double_splat

  end



  x.report 'delegate with triple dots' do

    o.foo_with_triple_dots

  end



  x.report 'delegate via forwardable' do

    o.foo

  end

end





(result)

         simple call     38.918M (=B1 0.9%) i/s -    194.884M

delegate without splat

                         31.933M (=B1 1.6%) i/s -    159.611M

 delegate with splat     10.269M (=B1 1.6%) i/s -     51.631M

delegate with splat with name

                          9.888M (=B1 1.0%) i/s -     49.588M

delegate with splat and double splat

                          4.117M (=B1 0.9%) i/s -     20.696M

delegate with triple dots

                          4.169M (=B1 0.9%) i/s -     20.857M

delegate via forwardable

                          9.204M (=B1 2.1%) i/s -     46.295M

```



It shows that Method delegation with a splat is 3-4 times slower (regardles=
s of whether the parameter is named or not), and delegation with a triple-d=
ot literal is 9-10 times slower than a method delegation without an argumen=
t.

This may be because calling a method taking a splat always assigns an Array=
 object even when no actual argument was given, and calling a method taking=
 triple-dots assigns five Array objects and two Hash objects (this is equiv=
alent to `*, **`).





Are there any chance reducing these object assignments and making them fast=
er? My concern is that the Rails framework heavily uses this kind of method=
 delegations, and presumably it causes unignorable performance overhead.







--=20

https://bugs.ruby-lang.org/

 ______________________________________________
 ruby-core mailing list -- [email protected]
 To unsubscribe send an email to [email protected]
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-c=
ore.ml.ruby-lang.org/

In This Thread