
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/