Issue #10341 has been updated by Eric Wong. Cool, I can confirm the performance results on one of my systems. I do not know the fiber code well, but it seems correct. I think fiber_mark_self (and any non-static functions) needs to be prefixed with "rb_" even if it is an internal API. ---------------------------------------- Feature #10341: Fiber switch performance improvements https://bugs.ruby-lang.org/issues/10341#change-49307 * 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) -- https://bugs.ruby-lang.org/