[#114774] [Ruby master Feature#19884] Make Safe Navigation Operator work on classes — "p8 (Petrik de Heus) via ruby-core" <ruby-core@...>
Issue #19884 has been reported by p8 (Petrik de Heus).
13 messages
2023/09/15
[ruby-core:114821] [Ruby master Bug#19890] File#realine(chomp: true) slower/more allocations than readline.chomp!
From:
"Dan0042 (Daniel DeLorme) via ruby-core" <ruby-core@...>
Date:
2023-09-19 18:36:34 UTC
List:
ruby-core #114821
Issue #19890 has been updated by Dan0042 (Daniel DeLorme).
tenderlovemaking (Aaron Patterson) wrote in #note-1:
> I think it would be cool if we could push a special frame for methods lik=
e `IO#readline` so that we know where user code is, but I feel a solution l=
ike that is beyond the scope of this ticket.
Something like that would be great. It's not a critical problem but it pops=
up frequently enough to be annoying. The same issue happens with regexp ps=
eudo-globals like `$1`, and also with `eval`. It's impossible to instrument=
`#eval` and `Regexp#match` with pass-thru layers (let's say for performanc=
e logging) because it then changes the behavior of the method. ex:
```ruby
module LogRegexpPerformance
def match(...) =3D log{ super }
def match?(...) =3D log{ super }
def =3D~(...) =3D log{ super }
prepend_features Regexp
end
/(a)/ =3D~ "a" #=3D> 0
$1 #=3D> nil ... ooops!
```
I think each stack frame should have a "forward_frame" flag which is set wh=
en using `super`. So we can walk up the call stack until we find a frame wi=
th forward_frame=3D=3D0, and set `$_` or `$1` in that stack frame (and poss=
ibly in all frames in between?)
I imagine calling a method with the `foo(...)` forward-everything syntax co=
uld also set the "forward_frame" flag. Then we could have something like:
```ruby
class Proxy < BasicObject
def initialize(obj)
@proxied =3D obj
end
def method_missing(...)
@proxied.send(...)
end
end
proxy =3D Proxy.new(io)
proxy.gets
$_ #=3D> correct value!
```
----------------------------------------
Bug #19890: File#realine(chomp: true) slower/more allocations than readline=
.chomp!
https://bugs.ruby-lang.org/issues/19890#change-104666
* Author: segiddins (Samuel Giddins)
* Status: Open
* Priority: Normal
* ruby -v: 3.2.2
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
On ruby 3.2.2 running the following script:
``` ruby
#!/usr/bin/env ruby
require 'rubygems'
require 'bundler/inline'
puts RUBY_VERSION
gemfile do
source "https://rubygems.org"
gem "benchmark-ipsa"
end
Benchmark.ipsa do |x|
x.report("f.readline(chomp: true)") do
File.open("/usr/share/dict/words") do |f|
f.readline(chomp: true) until f.eof?
end
end
=20
x.report("f.readline.chomp!") do
File.open("/usr/share/dict/words") do |f|
until f.eof?
s =3D f.readline
s.chomp!
s
end
end
end
=20
x.report("f.readline.chomp") do
File.open("/usr/share/dict/words") do |f|
until f.eof?
f.readline.chomp
end
end
end
=20
x.compare!
end
```
I get the following (surprising) result:
```
3.2.2
Allocations -------------------------------------
f.readline(chomp: true)
707931/1 alloc/ret 50/1 strings/ret
f.readline.chomp! 235979/1 alloc/ret 50/1 strings/ret
f.readline.chomp 471955/1 alloc/ret 50/1 strings/ret
Warming up --------------------------------------
f.readline(chomp: true)
1.000 i/100ms
f.readline.chomp! 2.000 i/100ms
f.readline.chomp 2.000 i/100ms
Calculating -------------------------------------
f.readline(chomp: true)
16.165 (=B1 6.2%) i/s - 81.000=20
f.readline.chomp! 25.246 (=B1 7.9%) i/s - 126.000=20
f.readline.chomp 20.997 (=B1 9.5%) i/s - 106.000=20
Comparison:
f.readline.chomp!: 25.2 i/s
f.readline.chomp: 21.0 i/s - 1.20x slower
f.readline(chomp: true): 16.2 i/s - 1.56x slower
```
I would expect `File#readline(chomp: true)` to be comparable to `s =3D f.re=
adline; s.chomp!; s` at a bare minimum, but it is slower and has more alloc=
ations even than `readline.chomp`
--=20
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-c=
ore.ml.ruby-lang.org/