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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Takashi Kokubun
September 08, 2022
Programming
3
12k
Towards Ruby 4 JIT / RubyKaigi 2022
RubyKaigi 2022
Takashi Kokubun
September 08, 2022
Tweet
Share
More Decks by Takashi Kokubun
See All by Takashi Kokubun
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
400
ZJIT: The Future of Ruby Performance / San Francisco Ruby Conference 2025
k0kubun
1
65
ZJIT: Building a New JIT Compiler for Ruby / REBASE 2025
k0kubun
0
70
Deoptimization: How YJIT Speeds Up Ruby by Slowing Down / RubyKaigi 2025
k0kubun
2
3.8k
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.2k
Optimizing Production Performance with MRI JIT / RubyConf 2021
k0kubun
1
520
Why Ruby's JIT was slow / RubyKaigi Takeout 2021
k0kubun
3
2k
Other Decks in Programming
See All in Programming
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
180
CSC307 Lecture 03
javiergs
PRO
1
490
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
2.4k
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
990
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
150
組織で育むオブザーバビリティ
ryota_hnk
0
170
AI巻き込み型コードレビューのススメ
nealle
0
130
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
1.1k
AgentCoreとHuman in the Loop
har1101
5
220
Fragmented Architectures
denyspoltorak
0
150
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
40k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
96
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
210
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
160
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Typedesign – Prime Four
hannesfritz
42
2.9k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
770
Claude Code のすすめ
schroneko
67
210k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Skip the Path - Find Your Career Trail
mkilby
0
53
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