Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Towards Ruby 4 JIT / RubyKaigi 2022
Search
Takashi Kokubun
September 08, 2022
Programming
12k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Towards Ruby 4 JIT / RubyKaigi 2022
RubyKaigi 2022
Takashi Kokubun
September 08, 2022
More Decks by Takashi Kokubun
See All by Takashi Kokubun
Lightning-Fast Method Calls with Ruby 4.1 ZJIT / RubyKaigi 2026
k0kubun
3
4.1k
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
3.4k
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
590
ZJIT: The Future of Ruby Performance / San Francisco Ruby Conference 2025
k0kubun
1
170
ZJIT: Building a New JIT Compiler for Ruby / REBASE 2025
k0kubun
0
190
Deoptimization: How YJIT Speeds Up Ruby by Slowing Down / RubyKaigi 2025
k0kubun
2
5k
YJIT Makes Rails 1.7x faster / RubyKaigi 2024
k0kubun
7
16k
Ruby JIT Hacking Guide / RubyKaigi 2023
k0kubun
2
11k
YJIT: Dive into Ruby's JIT compiler written in Rust / Rust.Tokyo 2022
k0kubun
2
2.4k
Other Decks in Programming
See All in Programming
Modernizing iOS Apps
seyfoyun
0
150
Crash Auto Pipelines
veronikapj
1
380
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
360
Performance Optimization With LLMs
xleitix
0
240
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
110
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
330
Railsバージョンを4倍にした話
optim
0
940
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
340
Distance field of Julia set
kinakomoti321
0
280
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
350
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
160
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
510
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Mobile First: as difficult as doing things right
swwweet
225
10k
Making the Leap to Tech Lead
cromwellryan
135
10k
Marketing to machines
jonoalderson
1
6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
880
GitHub's CSS Performance
jonrohan
1033
470k
Designing Experiences People Love
moore
143
24k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
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