Issue #19288 has been updated by luke-gru (Luke Gruber).
```ruby
RACTORS = ARGV.first == "ractor"
r = rand
J = { rand => rand }.to_json
Ractor.make_shareable(J)
if RACTORS
rs = []
10.times.each do
rs << Ractor.new(r) do |num|
data = receive()
i = 0
while i < 10_000
JSON.parse(data)
i+=1
end
end
end
rs.each do |r|
r.send(J)
end
rs.each(&:take)
else
1_000_000.times do
JSON.parse(J)
end
end
```
$ time ./ruby json_test.rb
real 0m5.622s
user 0m5.396s
$ time ./ruby json_test.rb ractor
real 0m0.890s
user 0m0.798s
This is with debug build of ruby too, so should be faster, but this shows that the issue
is with the large data being sent with Ractor#send. Chunk the data into smaller pieces
(more calls send and receive in a loop) and it will be faster.
----------------------------------------
Bug #19288: Ractor JSON parsing significantly slower than linear parsing
https://bugs.ruby-lang.org/issues/19288#change-101434
* 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 = 5
RACTORS = true
ELEMENTS = 100_000
data = CONCURRENT.times.map do
ELEMENTS.times.map do
{
rand => rand,
rand => rand,
rand => rand,
rand => rand
}.to_json
end
end
ractors = CONCURRENT.times.map do
Ractor.new do
Ractor.receive.each { JSON.parse(_1) }
end
end
result = 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.
--
https://bugs.ruby-lang.org/