[#112457] [Ruby master Feature#19443] Cache `Process.pid` — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Issue #19443 has been reported by byroot (Jean Boussier).
16 messages
2023/02/16
[#112584] [Ruby master Feature#19465] [PATCH] reuse open(2) from rb_file_load_ok on POSIX-like system — "normalperson (Eric Wong) via ruby-core" <ruby-core@...>
Issue #19465 has been reported by normalperson (Eric Wong).
9 messages
2023/02/25
[#112595] [Ruby master Feature#19465] [PATCH] reuse open(2) from rb_file_load_ok on POSIX-like system
— "nobu (Nobuyoshi Nakada) via ruby-core" <ruby-core@...>
2023/02/25
SXNzdWUgIzE5NDY1IGhhcyBiZWVuIHVwZGF0ZWQgYnkgbm9idSAoTm9idXlvc2hpIE5ha2FkYSku
[#112613] Re: [Ruby master Feature#19465] [PATCH] reuse open(2) from rb_file_load_ok on POSIX-like system
— Eric Wong via ruby-core <ruby-core@...>
2023/02/26
"nobu (Nobuyoshi Nakada) via ruby-core" <[email protected]> wrote:
[#112615] Re: [Ruby master Feature#19465] [PATCH] reuse open(2) from rb_file_load_ok on POSIX-like system
— SHIBATA Hiroshi via ruby-core <ruby-core@...>
2023/02/27
MzUxMzZlMWU5YzIzMmFkN2EwMzQwN2I5OTJiMmU4NmI2ZGY0M2Y2MyBpcyBicm9rZW4gd2l0aCBg
[#112626] Re: [Ruby master Feature#19465] [PATCH] reuse open(2) from rb_file_load_ok on POSIX-like system
— Eric Wong via ruby-core <ruby-core@...>
2023/02/28
```
[ruby-core:112528] [Ruby master Feature#18285] NoMethodError#message uses a lot of CPU/is really expensive to call
From:
"Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>
Date:
2023-02-21 22:07:44 UTC
List:
ruby-core #112528
Issue #18285 has been updated by Eregon (Benoit Daloze).
mame (Yusuke Endoh) wrote in #note-38:
> ```
> new: undefined method `foo' for main
> ```
I think that's quite confusing though without the `main:Object`, because `m=
ain` has many other meanings (main script =3D $0, main function, etc).
So I'd suggest either:
```
undefined method `foo' for main:Object
undefined method `foo' for main object
```
----------------------------------------
Feature #18285: NoMethodError#message uses a lot of CPU/is really expensive=
to call
https://bugs.ruby-lang.org/issues/18285#change-101976
* Author: ivoanjo (Ivo Anjo)
* Status: Closed
* Priority: Normal
----------------------------------------
Hello there! I'm working at Datadog on the ddtrace gem -- https://github.co=
m/DataDog/dd-trace-rb and we ran into this issue on one of our internal tes=
ting applications. I also blogged about this issue in <https://ivoanjo.me/b=
log/2021/11/01/nomethoderror-ruby-cost/>.
### Background
While testing an application that threw a lot of `NoMethodError`s in a Rail=
s controller (this was used for validation), we discovered that service per=
formance was very much impacted when we were logging these exceptions. Whil=
e investigating with a profiler, the performance impact was caused by calls=
to `NoMethodError#message`, because this Rails controller had a quite comp=
lex `#inspect` method, that was getting called every time we tried to get t=
he `#message` from the exception.
### How to reproduce
```ruby
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'benchmark-ips'
end
puts RUBY_DESCRIPTION
class GemInformation
# ...
def get_no_method_error
method_does_not_exist
rescue =3D> e
e
end
def get_runtime_error
raise 'Another Error'
rescue =3D> e
e
end
def inspect # <-- expensive method gets called when calling NoMethodError=
#message
Gem::Specification._all.inspect
end
end
NO_METHOD_ERROR_INSTANCE =3D GemInformation.new.get_no_method_error
RUNTIME_ERROR_INSTANCE =3D GemInformation.new.get_runtime_error
Benchmark.ips do |x|
x.config(:time =3D> 5, :warmup =3D> 2)
x.report("no method error message cost") { NO_METHOD_ERROR_INSTANCE.messa=
ge }
x.report("runtime error message cost") { RUNTIME_ERROR_INSTANCE.message }
x.compare!
end
```
### Expectation and result
Getting the `#message` from a `NoMethodError` should be no costly than gett=
ing it from any other exception.
In reality:
```
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
no method error message cost
115.390 (=B1 1.7%) i/s - 580.000 in 5.027822s
runtime error message cost
6.938M (=B1 0.5%) i/s - 35.334M in 5.092617s
Comparison:
runtime error message cost: 6938381.6 i/s
no method error message cost: 115.4 i/s - 60130.02x (=B1 0.00) slower
```
### Suggested solutions
1. Do not call `#inspect` on the object on which the method was not found (=
see <https://github.com/ruby/ruby/blob/e0915ba67964d843832148aeca29a1f8244c=
a7b1/error.c#L1962>)
2. Cache result of calling `#message` after the first call. Ideally this sh=
ould be done together with suggestion 1.
--=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/