Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Towards Ruby 4 JIT / RubyKaigi 2022
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takashi Kokubun
September 08, 2022
Programming
12k
3
Share
Towards Ruby 4 JIT / RubyKaigi 2022
RubyKaigi 2022
Takashi Kokubun
September 08, 2022
More Decks by Takashi Kokubun
See All by Takashi Kokubun
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
3
2.7k
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
450
ZJIT: The Future of Ruby Performance / San Francisco Ruby Conference 2025
k0kubun
1
93
ZJIT: Building a New JIT Compiler for Ruby / REBASE 2025
k0kubun
0
95
Deoptimization: How YJIT Speeds Up Ruby by Slowing Down / RubyKaigi 2025
k0kubun
2
4k
YJIT Makes Rails 1.7x faster / RubyKaigi 2024
k0kubun
7
15k
Ruby JIT Hacking Guide / RubyKaigi 2023
k0kubun
2
10k
YJIT: Dive into Ruby's JIT compiler written in Rust / Rust.Tokyo 2022
k0kubun
2
2.3k
Optimizing Production Performance with MRI JIT / RubyConf 2021
k0kubun
1
530
Other Decks in Programming
See All in Programming
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
1
230
forteeの改修から振り返るPHPerKaigi 2026
muno92
PRO
3
120
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
140
AI 開発合宿を通して得た学び
niftycorp
PRO
0
190
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
160
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
120
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
210
Rethinking API Platform Filters
vinceamstoutz
0
5.4k
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
540
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
180
年間50登壇、単著出版、雑誌寄稿、Podcast出演、YouTube、CM、カンファレンス主催……全部やってみたので面白さ等を比較してみよう / I’ve tried them all, so let’s compare how interesting they are.
nrslib
4
660
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
120
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Utilizing Notion as your number one productivity tool
mfonobong
4
280
Context Engineering - Making Every Token Count
addyosmani
9
790
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
110
Become a Pro
speakerdeck
PRO
31
5.9k
4 Signs Your Business is Dying
shpigford
187
22k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.2k
A better future with KSS
kneath
240
18k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Navigating Team Friction
lara
192
16k
Between Models and Reality
mayunak
3
250
Transcript
Towards Ruby 4 JIT @k0kubun
@k0kubun Maintain: MJIT, Haml, ERB Shopify team
GitHub Sponsors
Haml 6
Introduction to Ruby JIT
How does Ruby JIT work? Ruby
How does Ruby JIT work? 1 + 2 Ruby Abstract
Syntax Tree
How does Ruby JIT work? 1 + 2 putobject 1
putobject 2 opt_plus leave Ruby Abstract Syntax Tree Instruction Sequence (Bytecode)
How does Ruby JIT work? 1 + 2 putobject 1
putobject 2 opt_plus leave Ruby Abstract Syntax Tree Instruction Sequence (Bytecode) Machine Code
How does Ruby JIT work?
CRuby JIT 1: MJIT
CRuby JIT 2: YJIT
Current CRuby JITs speed.yjit.org
Current CRuby JITs speed.yjit.org
Current CRuby JITs • YJIT • Available since Ruby 3.1
• --jit or --yjit • MJIT • Available since Ruby 2.6 • --mjit
Current CRuby JITs • YJIT • Ruby 3.1: x86_64 only,
no code GC, written in C • Ruby 3.2: arm64 support, (hopefully) code GC, written in Rust • MJIT • Ruby 3.1: Stable-ish, portable, native threads, written in C • Ruby 3.2: Experimental, fork + SIGCHLD, written in Ruby
MJIT in Ruby
None
None
mjit.rb: Secret "standard library" in Ruby 3.2 • mjit.rb •
Even more powerful than TracePoint • You can monkey-patch CRuby JIT • No compatibility guarantee • Every module is private, so const_get is required
BYOJ: Bring Your Own JIT
BYOJ: Bring Your Own JIT • Load and pause MJIT
with --mjit=pause • Define RubyVM::MJIT.compile • Use RubyVM::MJIT.const_get(:C) to hack RubyVM • Call RubyVM::MJIT.resume to start JIT With Ruby 3.2:
YJIT-style JIT • Monkey-patch RubyVM::MJIT.compile
MJIT-style JIT • Monkey-patch RubyVM::MJIT::Compiler.compile
MJIT-style JIT
Everyone is writing CRuby JIT
Benchmarking Ruby JIT
yjit-bench
yjit-bench • yjit-bench has three kinds of benchmarks: 1. Headlining
Benchmarks 2. Other Benchmarks 3. Micro Benchmarks
1. Headlining benchmarks • activerecord • hexapdf • liquid-render •
mail • psych-load • railsbench ✉
2. Other Benchmarks • binarytrees, fankuchredux, nbody • chunky_png •
erubi, erubi_rails • lee • optcarrot • rubykon
3. Micro Benchmarks • 30k_ifelse, 30k_methods • cfunc_itself, str_concat •
fib • getivar, setivar • keyword_args • respond_to
None
Benchmark Your Own JIT • ./run_benchmarks.rb -e “/path/to/ruby --any-option” •
Pass multiple -e options to compare different JITs
Towards Ruby 4 JIT
My wish on Ruby 4 JIT • I want Ruby
4 to be as fast as Java or JavaScript • Ruby 4's performance should be a reason to leave Python
None
More Concrete Examples
None
None
None
Ruby 4 Canary • true is mov-ed (immediate) • No
opt_* VM instruction • Constant folding • Ruby / C method inlining
Ruby 4 Canary’ • Single branch instruction to access @one
• Single register to access two • No heap allocation • No stack frame
None
None
Ruby 4 Canary 2 • 5000050000 is mov-ed (immediate) •
Ruby -> C -> Ruby inlining
How can we get there?
Optimization Challenges 1. Constants 2. Variables 3. Method calls 4.
Garbage collection
1. Constants
1. Constants
1. Constants
1. Constants
1. Constants
1. Constants
1. Constants
1. Constants
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables
2. Variables 2021 2022 (tomorrow)
3. Method calls
3. Method calls
3. Method calls
3. Method calls
3. Method calls
3. Method calls
3. Method calls • Code locality • Method inlining: C
㱻 Ruby • Pass arguments with native ABI • Deoptimization on redefinition or interruption (or TracePoint)
4. Garbage collection
4. Garbage collection
4. Garbage collection
Next Steps • We still have a lot of rooms
for improvements on yjit-bench • More cross-instruction optimizations • More method inlining over Ruby and C
Conclusion • Build your own JIT with Ruby 3.2 •
Benchmark your JIT with yjit-bench