Issue #10341 has been updated by Eric Wong.


 Maybe this is a simple fix for win32, but I cannot test:
 
 diff --git a/cont.c b/cont.c
 index 739ec80..08acf40 100644
 --- a/cont.c
 +++ b/cont.c
 @@ -1366,10 +1366,10 @@ fiber_store(rb_fiber_t *next_fib, rb_thread_t *th)
  	terminated_machine_stack.ptr = NULL;
  	terminated_machine_stack.size = 0;
      }
 +#endif /* not _WIN32 */
      fib = th->fiber;
      if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value);
      return fib->cont.value;
 -#endif /* not _WIN32 */
  
  #else /* FIBER_USE_NATIVE */
      cont_save_machine_stack(th, &fib->cont);

----------------------------------------
Feature #10341: Fiber switch performance improvements
https://bugs.ruby-lang.org/issues/10341#change-49484

* Author: Knut Franke
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
----------------------------------------
The attached patches increase performance of switches between Fibers by ~17% on my test system (Linux, gcc 4.8.2).

Patches 1-3 are purely cosmetic, but included here because submitting them separately would cause conflicts between the patch sets. If these are rejected, I can prepare stand-alone versions of 4/5.

Patch 4 yields the most significant performance increase (~12%). The benefit of patch 5 is lower, and it's a larger change; so this one could optionally be omitted.

~~~
require 'benchmark'

fib = Fiber.new do
	loop { Fiber.yield }
end

Benchmark.bm do |bm|
	3.times do
		results << bm.report { 10_000_000.times { fib.resume } }
	end
	avg = results.inject(:+) / results.size
        [avg]
end
~~~

Raw benchmarking results:

~~~
trunk@47827 - 7.59s
patch 4           - 6.59s (87% of trunk)
patch 4+5      - 6.33s (83% of trunk)
~~~

---Files--------------------------------
0001-Remove-unused-prev_fiber-next_fiber-fields.patch (2.02 KB)
0002-Code-cleanup-in-fiber_switch-fiber_store.patch (4.79 KB)
0003-Small-code-cleanup.patch (1.16 KB)
0004-cont_save_thread-Sparse-copying-of-thread-data.patch (3.39 KB)
0005-Optimize-fiber_switch-callees.patch (13.9 KB)
0005-Optimize-fiber_switch-callees.patch (13.9 KB)


-- 
https://bugs.ruby-lang.org/