From: "Eregon (Benoit Daloze) via ruby-core" Date: 2023-01-24T11:31:49+00:00 Subject: [ruby-core:112002] [Ruby master Bug#19288] Ractor JSON parsing significantly slower than linear parsing Issue #19288 has been updated by Eregon (Benoit Daloze). maciej.mensfeld (Maciej Mensfeld) wrote in #note-4: > I find this issue important and if mitigated, it would allow me to release production-grade functionalities that would benefit users of the Ruby language. Note that Ractor is far from production-ready. It has many issues as can be found on this bug tracker and when using it and as the warning says (`Also there are many implementation issues.`). Also the fact that the main Ruby test suites don't run any Ractor test in the same process also seems an indication of instability. And then of course there is the issue that Ractor is incompatible with most gems/code out there. While JSON loading might work, any non-trivial processing after using a gem is unlikely to work well. Other Rubies have solved this in a much more efficient, usable and reliable way, by having no GVL. ---------------------------------------- Bug #19288: Ractor JSON parsing significantly slower than linear parsing https://bugs.ruby-lang.org/issues/19288#change-101436 * 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/ ______________________________________________ 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-core.ml.ruby-lang.org/