summaryrefslogtreecommitdiff
path: root/test/ruby/test_rubyvm.rb
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-12-14 10:46:52 +0100
committerJean Boussier <jean.boussier@gmail.com>2025-12-16 09:51:07 +0100
commit28b195fc67788c03be59c2a4cbf0cad52ac3b90f (patch)
tree327be50507e3c34643f48bfa7091d57871be616f /test/ruby/test_rubyvm.rb
parent85b40c5ea8f606cf34cab8a5b1277033bede2457 (diff)
Store the fiber_serial in the EC to allow inlining
Mutexes spend a significant amount of time in `rb_fiber_serial` because it can't be inlined (except with LTO). The fiber struct is opaque the so function can't be defined as inlineable. Ideally the while fiber struct would not be opaque to the rest of Ruby core, but it's tricky to do. Instead we can store the fiber serial in the execution context itself, and make its access cheaper: ``` $ hyperfine './miniruby-baseline --yjit /tmp/mut.rb' './miniruby-inline-serial --yjit /tmp/mut.rb' Benchmark 1: ./miniruby-baseline --yjit /tmp/mut.rb Time (mean ± σ): 4.011 s ± 0.084 s [User: 3.977 s, System: 0.011 s] Range (min … max): 3.950 s … 4.245 s 10 runs Benchmark 2: ./miniruby-inline-serial --yjit /tmp/mut.rb Time (mean ± σ): 3.495 s ± 0.150 s [User: 3.448 s, System: 0.009 s] Range (min … max): 3.340 s … 3.869 s 10 runs Summary ./miniruby-inline-serial --yjit /tmp/mut.rb ran 1.15 ± 0.05 times faster than ./miniruby-baseline --yjit /tmp/mut.rb ``` ```ruby i = 10_000_000 mut = Mutex.new while i > 0 i -= 1 mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } mut.synchronize { } end ```
Diffstat (limited to 'test/ruby/test_rubyvm.rb')
0 files changed, 0 insertions, 0 deletions