Project

General

Profile

Actions

Bug #18760

closed

Ractors vs "skynet" microbenchmark

Added by zverok (Victor Shepelev) about 2 years ago. Updated almost 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:108430]

Description

I recently stumbled upon skynet concurrency microbenchmark and tried to adapt it to Ruby ractors.
The microbenchmarks of this kind are obviously limited, but at least they allow to do super-rough estimations of "how we are doing". It just spawns an actor (or coroutine, or channel, etc., depending on the language), which spawns 10 more, each spawning 10 more... till there are a million of them; then each just returns its ordinal number, and parents sum them up.

Ruby code:

N = 1_000_000

def skynet(num, size, div)
  if size == 1
    Ractor.yield num
  else
    children = div.times.map { |i|
      sub_num = num + i*(size/div)
      Ractor.new(sub_num, size/div, div) { |n, sz, d| skynet(n, sz, d) }
    }
    sum = children.sum(&:take)
    Ractor.yield sum
  end
end

start_time = Time.now
main = Ractor.new { skynet(0, N, 10) }
result = main.take
end_time = Time.now
puts "Result: #{result} in #{(end_time - start_time)}s."

(of course, it is better to use Process.getclocktime probably, but that's not the point at the moment)

The point is, what I found out seems to indicate we still have some room for improvement for Ractors, to say the least.

$ ruby -v
ruby 3.2.0dev (2022-04-28T06:44:02Z master 5250210aa9) [x86_64-linux]

Results on my machine (Thinkpad E300, 8Gb mem):

  • N=1000: Result: 499500 in 1.614297829s. (BTW, on ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [x86_64-linux] I also checked, it was much faster: 0.3-0.4s typically)
  • N=10_000: Result: 49995000 in 46.89935975s. (really long?)
  • N=100_000: Aborted (core dumped)

Not sure this is telling something useful (and not sure I ported benchmark properly, TBH)

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0