[#111712] [Ruby master Feature#19322] Support spawning "private" child processes — "kjtsanaktsidis (KJ Tsanaktsidis) via ruby-core" <ruby-core@...>
SXNzdWUgIzE5MzIyIGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGtqdHNhbmFrdHNpZGlzIChLSiBUc2Fu
14 messages
2023/01/07
[ruby-core:112109] [Ruby master Bug#19288] Ractor JSON parsing significantly slower than linear parsing
From:
duerst via ruby-core <ruby-core@...>
Date:
2023-01-30 02:46:37 UTC
List:
ruby-core #112109
Issue #19288 has been updated by duerst (Martin D=FCrst).
Eregon (Benoit Daloze) wrote in #note-7:
> And then of course there is the issue that Ractor is incompatible with mo=
st gems/code out there.
> While JSON loading might work, any non-trivial processing after using a g=
em is unlikely to work well.
> Other Rubies have solved this in a much more efficient, usable and reliab=
le way, by having no GVL.
But don't other Rubies rely on the programmer to know how to program with t=
hreads? That's only usable if you're used to programming with threads and a=
void the related issues. The idea (where the implementation and many gems m=
ay still have to catch up) behind Ractor is that thread-related issues such=
as data races can be avoided at the level of the programming model.
----------------------------------------
Bug #19288: Ractor JSON parsing significantly slower than linear parsing
https://bugs.ruby-lang.org/issues/19288#change-101546
* Author: maciej.mensfeld (Maciej Mensfeld)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-linux]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
a simple benchmark:
```ruby
require 'json'
require 'benchmark'
CONCURRENT =3D 5
RACTORS =3D true
ELEMENTS =3D 100_000
data =3D CONCURRENT.times.map do
ELEMENTS.times.map do
{
rand =3D> rand,
rand =3D> rand,
rand =3D> rand,
rand =3D> rand
}.to_json
end
end
ractors =3D CONCURRENT.times.map do
Ractor.new do
Ractor.receive.each { JSON.parse(_1) }
end
end
result =3D Benchmark.measure do
if RACTORS
CONCURRENT.times do |i|
ractors[i].send(data[i], move: false)
end
ractors.each(&:take)
else
# Linear without any threads
data.each do |piece|
piece.each { JSON.parse(_1) }
end
end
end
puts result
```
Gives following results on my 8 core machine:
```shell
# without ractors:
2.731748 0.003993 2.735741 ( 2.736349)
# with ractors
12.580452 5.089802 17.670254 ( 5.209755)
```
I would expect Ractors not to be two times slower on the CPU intense work.
--=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/