https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112022-04-28T17:11:13ZRuby Issue Tracking SystemRuby master - Bug #18760: Ractors vs "skynet" microbenchmarkhttps://bugs.ruby-lang.org/issues/18760?journal_id=974702022-04-28T17:11:13ZEregon (Benoit Daloze)
<ul></ul><p>Each Ractor currently uses one pthread behind the scenes, so you're spawning N threads and that's of course slow.<br>
This benchmark works likely a lot better with <code>Fiber</code> instead of <code>Ractor</code>.</p>
<p>However I heard <a class="user active user-mention" href="https://bugs.ruby-lang.org/users/17">@ko1 (Koichi Sasada)</a> is working on pooling multiple Ractors per native thread, which would help for this microbenchmark.<br>
(This microbenchmark is rather silly if you ask me, because it's like the worst case overhead for concurrency primitives, not representative of anything real world).</p> Ruby master - Bug #18760: Ractors vs "skynet" microbenchmarkhttps://bugs.ruby-lang.org/issues/18760?journal_id=974722022-04-28T19:53:54Zzverok (Victor Shepelev)zverok.offline@gmail.com
<ul></ul><blockquote>
<p>this microbenchmark (which is rather silly if you ask me, because it's like the worst case overhead for concurrency primitives, not representative of anything real world)</p>
</blockquote>
<p>I think that's the point (as it is for many microbenchmarks): demonstrate edge case performance for some technology. To my knowledge, <code>boost::fiber</code> of C++ and OpenJDK use this benchmark, so I was interested in what it will show.</p>
<p>To the best of my understanding, using <code>Fiber</code>s wouldn't be appropriate as they don't demonstrate true concurrency? (But I might be wrong, my understanding of concurrency/parallelism is flawed, to say the least.)</p> Ruby master - Bug #18760: Ractors vs "skynet" microbenchmarkhttps://bugs.ruby-lang.org/issues/18760?journal_id=974772022-04-29T05:02:10Zduerst (Martin Dürst)duerst@it.aoyama.ac.jp
<ul></ul><p>Eregon (Benoit Daloze) wrote in <a href="#note-1">#note-1</a>:</p>
<blockquote>
<p>However I heard <a class="user active user-mention" href="https://bugs.ruby-lang.org/users/17">@ko1 (Koichi Sasada)</a> is working on pooling multiple Ractors per native thread, which would help for this microbenchmark (which is rather silly if you ask me, because it's like the worst case overhead for concurrency primitives, not representative of anything real world).</p>
</blockquote>
<p>I guess that with silly, you mean the benchmark, not pooling of multiple Ractors.</p> Ruby master - Bug #18760: Ractors vs "skynet" microbenchmarkhttps://bugs.ruby-lang.org/issues/18760?journal_id=974812022-04-29T10:52:20ZEregon (Benoit Daloze)
<ul></ul><p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/50">@duerst (Martin Dürst)</a> Yes, of course, I only criticize the benchmark.</p>
<p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/710">@zverok (Victor Shepelev)</a> Note how the README doesn't mention anything based on N native threads?<br>
That's because this benchmark doesn't make sense for that case, and would fail too with N=100000 if you used pthreads directly in C.<br>
Fibers are a concurrency primitive but indeed Fibers of a given Thread don't run in parallel.<br>
(Since Threads don't run in parallel on CRuby it also means Fibers are never run in parallel on CRuby but on JRuby/TruffleRuby Fibers of different Threads do run in parallel)</p>
<p>Some of the "Futures / promises" as well as some of the "Coroutines / fibers / channels" results on the README also likely don't run in parallel.</p>
<p>So basically this benchmark assumes a concurrency primitive which is pooled on number of native threads = number of cores, and measuring anything else is comparing apples and oranges.<br>
CRuby doesn't have that currently, but might have it in the future with <a class="user active user-mention" href="https://bugs.ruby-lang.org/users/17">@ko1 (Koichi Sasada)</a> M:N's proposal.</p> Ruby master - Bug #18760: Ractors vs "skynet" microbenchmarkhttps://bugs.ruby-lang.org/issues/18760?journal_id=975002022-05-02T23:36:21Zshan (Shannon Skipper)
<ul></ul><p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/710">@zverok (Victor Shepelev)</a> here's a Ruby example with Fibers that I ported from <code>skynet.cr</code>.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">require</span> <span class="s1">'async'</span>
<span class="nb">require</span> <span class="s1">'async/queue'</span>
<span class="k">def</span> <span class="nf">skynet</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">num</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">div</span><span class="p">)</span>
<span class="k">if</span> <span class="n">size</span> <span class="o">==</span> <span class="mi">1</span>
<span class="n">c</span> <span class="o"><<</span> <span class="n">num</span>
<span class="k">else</span>
<span class="n">rc</span> <span class="o">=</span> <span class="no">Async</span><span class="o">::</span><span class="no">LimitedQueue</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">div</span><span class="p">)</span>
<span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">div</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
<span class="n">sub_num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">*</span> <span class="p">(</span><span class="n">size</span> <span class="o">/</span> <span class="n">div</span><span class="p">))</span>
<span class="no">Async</span> <span class="p">{</span> <span class="n">skynet</span><span class="p">(</span><span class="n">rc</span><span class="p">,</span> <span class="n">sub_num</span><span class="p">,</span> <span class="n">size</span> <span class="o">/</span> <span class="n">div</span><span class="p">,</span> <span class="n">div</span><span class="p">)</span> <span class="p">}</span>
<span class="k">end</span>
<span class="n">div</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span>
<span class="n">sum</span> <span class="o">+=</span> <span class="n">rc</span><span class="p">.</span><span class="nf">dequeue</span>
<span class="k">end</span>
<span class="n">c</span> <span class="o"><<</span> <span class="n">sum</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">c</span> <span class="o">=</span> <span class="no">Async</span><span class="o">::</span><span class="no">LimitedQueue</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span>
<span class="no">Sync</span> <span class="p">{</span> <span class="n">skynet</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1_000_000</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="p">}</span>
<span class="n">result</span> <span class="o">=</span> <span class="no">Sync</span> <span class="p">{</span> <span class="n">c</span><span class="p">.</span><span class="nf">dequeue</span> <span class="p">}</span>
<span class="n">end_time</span> <span class="o">=</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span>
<span class="nb">puts</span> <span class="s2">"Result: </span><span class="si">#{</span><span class="n">result</span><span class="si">}</span><span class="s2"> in </span><span class="si">#{</span><span class="n">end_time</span> <span class="o">-</span> <span class="n">start_time</span><span class="si">}</span><span class="s2">s."</span>
</code></pre> Ruby master - Bug #18760: Ractors vs "skynet" microbenchmarkhttps://bugs.ruby-lang.org/issues/18760?journal_id=985182022-07-29T15:15:07Zzverok (Victor Shepelev)zverok.offline@gmail.com
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul>