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
Cコンパイラを利用したRubyのJITコンパイラ / Programming Symposiu...
Search
Takashi Kokubun
January 12, 2019
Programming
6
3.3k
Cコンパイラを利用したRubyのJITコンパイラ / Programming Symposium 60
第60回 プログラミング・シンポジウム
Takashi Kokubun
January 12, 2019
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
Towards Ruby 4 JIT / RubyKaigi 2022
k0kubun
3
12k
Optimizing Production Performance with MRI JIT / RubyConf 2021
k0kubun
1
520
Other Decks in Programming
See All in Programming
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
130
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
110
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
710
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.3k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.4k
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
680
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
170
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Abbi's Birthday
coloredviolet
1
4.7k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
ラッコキーワード サービス紹介資料
rakko
1
2.2M
Site-Speed That Sticks
csswizardry
13
1.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
92
Speed Design
sergeychernyshev
33
1.5k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
110
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
51
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.6k
Transcript
CίϯύΠϥΛར༻ͨ͠ RubyͷJITίϯύΠϥ ࠃਸࢤ / Arm Treasure Data ୈ60ճ ϓϩάϥϛϯά γϯϙδϜ
ࣗݾհ • ࠃ ਸࢤ (@k0kubun) • ॴଐ: τϨδϟʔσʔλגࣜձࣾ (Arm͕ങऩ) •
Rubyίϛολʔ 3 • JITίϯύΠϥΛ։ൃ • ςϯϓϨʔτΤϯδϯͷϝϯςφ
LLRB - LLVMϕʔεͷRubyͷJIT
Ruby 2.6ͰͷJIT։ൃ
ΞδΣϯμ • RubyͷJITख๏ͷ֓ཁ • རɺܽɺ࣮ݱՄೳͳ࠷దԽྫ • ੑೳධՁ
RubyͷJITख๏ͷ֓ཁ
RubyͱJITʹ͍ͭͯ • Ruby: ಈతܕ͚ͷΦϒδΣΫτࢦεΫϦϓτݴޠ • ελοΫϕʔεͷόΠτίʔυΛ࣋ͭVirtual Machine • JITίϯύΠϧ: ࣮ߦ࣌ίϯύΠϧ
• ຊൃදͰɺRuby VMͷόΠτίʔυͷ͔ΘΓʹɺJITͰੜ ͨ͠ػցޠΛݺͼग़͢͜ͱͰ࠷దԽ͢Δతʹ͏
RubyʹJITΛಋೖ͢Δഎܠͱత എܠ: • RubyWebΞϓϦέʔγϣϯʹΑ͘ΘΕΔ త: • WebΞϓϦέʔγϣϯαʔόʔͳͲظ࣮ߦ͢Δϓϩ άϥϜͰੑೳΛ্͛ɺϢʔβʔମݧΛ্ͤͨ͞Γɺ αʔόʔΛݮΒͨ͠Γ͍ͨ͠
ຊख๏ͷ֓ཁ • ΠϯλϓϦλىಈ࣌ʹJIT༻ͷεϨουΛىಈ • Ruby 2.6ͷ࣌ͰσϑΥϧτͰͳ͍ͷͰɺཁ --jit • ϝΠϯͷεϨουͰ5ճҎ্ݺͼग़͞Εͨϝιου͕ Ωϡʔʹੵ·ΕΔ
• JIT༻ͷεϨου͕ϝιου୯ҐͰόΠτίʔυΛػցޠ ʹίϯύΠϧ
ຊख๏ͷ֓ཁ 1. όΠτίʔυΛCͷίʔυʹม + CͷϨϕϧͰ࠷దԽ 2. σΟεΫ (/tmp) ʹ .c
ͷϑΝΠϧΛॻ͖ग़͢ 3. RubyΠϯλϓϦλ͕࣮ߦ࣌ʹCίϯύΠϥϓϩηεΛىಈ 4. ੜͨ͠ .so ϑΝΠϧΛಈతϩʔυ 5. όΠτίʔυͷΘΓʹϩʔυͨؔ͠ΛݺͿΑ͏ʹมߋ
ຊख๏ͷ֓ཁ
ຊख๏ͷ֓ཁ
None
RubyͷJITख๏ͷར
ར 1: ΞηϯϒϦίʔυੜ͔Βͷ։์ • ؆୯: ςϯϓϨʔτΤϯδϯͰಈతͳCίʔυੜ • VMΛ࣮͢Δ͚ͩͰσϑΥϧτͷJIT࣮ΛࣗಈੜͰ͖Δ • ϙʔλϒϧ:
ΠϯλϓϦλ͕ϏϧυͰ͖ΔڥͰ͑Δͣ • Cͷ༷͕มΘΒͳ͍ͷͰLLVMͷΑ͏ʹඇޓʹৼΓճ͞Εͳ͍
ར 2: σόοΨΛͬͨղੳίετͷԼ • gdbͰσόοά͢ΔࡍɺVMͷ࣮ͱಉ͡C͚ͩΛݟΔ͜ ͱʹͳΔ • ίʔυੜ͕ࣗલͳΒɺσόοάใೖΕΔͷࣗલʹͳ Γେมͦ͏
ར 3: ϨΠϠʔͷ࠷దԽͷ CίϯύΠϥͷҠৡ • ༷ʑͳ࠷దԽςΫχοΫΛ࠶ൃ໌͢ΔϦιʔεͳ͍ • ੜίʔυ͔ΒVMͷؔΛ༰қʹΠϯϥΠϯԽՄೳ
ར 4: ෳͷίϯύΠϥج൫͕׆༻Մೳ • GCCͱClang/LLVMͷ྆ํ͕ར༻ՄೳͰɺVisual Studioʹ ରԠ • Ζ͏ͱࢥ͑LLVM PassΛࣗ࡞ͯ͠
opt(1) ͔Β͑Δ ͔͠Εͳ͍
RubyͷJITख๏ͷܽ
ܽ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ Φʔόʔϔου • dlopen ͢Δͱ֤ϝιου(.soϑΝΠϧ)͕3ͭͷϖʔδʹׂ ͞Εͯϩʔυ͞ΕɺΩϟογϡʹѱӨڹ • ͳͷͰɺޙͰෳͷϝιουΛ·ͱΊͯ࠶ίϯύΠϧ͍ͯ͠
Δ͕ɺ໘
ܽ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ Φʔόʔϔου ৄࡉ: http://shinh.hatenablog.com/entry/2018/06/10/235314
ܽ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ Φʔόʔϔου https://github.com/ruby/ruby/pull/1921
ܽ 2: ࣮ߦ࣌ґଘͷෳࡶԽ - CίϯύΠϥ • ͜Ε·ͰɺCίϯύΠϥΠϯλϓϦλ͔Β࣮ߦՄೳͳඞ ཁͳ͔ͬͨ • ϓϦίϯύΠϧυϔομCίϯύΠϥͷόʔδϣϯʹґ
ଘ͢ΔͷͰɺຖճίϯύΠϧ
ܽ 3: ίϯύΠϥ͝ͱͷࠩҟͷରԠ • CίϯύΠϥ͝ͱʹҟͳΔΦϓγϣϯʹରԠ͢Δඞཁ͕͋Δ • جຊతʹΠϯλϓϦλͷϏϧυͱಉ͡CFLAGS͕ඞਢͩ ͕ɺҰ෦ٯʹΒͳ͍ͱಈ͔ͳ͍ • GCCʹউखͳύον͕ͨͬͯΔOSͷσΟετϦϏϡʔ
γϣϯ͋Δ • Visual StudioϓϦϓϩηε͚ͩͯ͠ग़ྗ͕Ͱ͖ͣશ͘ผͷ ϏϧυγεςϜ
ܽ 4: ϓϩηεཧ෦ͷ อकίετͷ૿େ • Ruby͕ىಈͨ͠ࢠϓϩηεΛશͯwait͢Δϝιου͕͋ Δ͕ɺવJIT༻GCCͪͨ͘ͳ͍ • ͳͷͰɺϩοΫΛऔΓͭͭpidͷϦετΛཧ͢Δ •
ϚϧνεϨου + Ϛϧνϓϩηε + γάφϧϋϯυϥ = ແݶͷrace condition • JITεϨουGVLͳ͠ɺϝΠϯͷεϨουJITεϨο υfork͠·͘ΓɺSIGCHLDདྷ·͘Γ
ܽ 5: ηΩϡϦςΟ্ͷݒ೦ • CίϯύΠϥϔομɺϥΠϒϥϦ͕ࠩ͠ସ͑ΒΕΔͱࠔΔ • CίϯύΠϥϏϧυ࣌ͱશ͘ಉ͡ϑϧύεΛ͏ • /tmp ʹݩ͔ΒϑΝΠϧ͕͋Δ߹͘
• Έ্Ͳ͏͠Α͏ͳ͍ͷׂΓΔ • Ϣʔβʔ͕GCCΛࣗ༝ʹ࣮ߦͰ͖ΔΑ͏ͳϓϩάϥϜͦΕࣗମ͕੬ऑ • GCCϔομɺੜίʔυ͕ࠩ͠ସ͑ΒΕΔύʔϛογϣϯΛऔΒΕͯෛ͚
RubyͷJITख๏Ͱ ࣮ݱՄೳͳ࠷దԽྫ
࠷దԽ 1: ελοΫϙΠϯλɺ ϓϩάϥϜΧϯλͷҠಈݮ • ελοΫϕʔεͷVM͕͏ελοΫϙΠϯλͷૢ࡞͕ෆཁ • ྫ֎ͰେҬग़ͯ͠ελοΫͤͳ͍ͱ͍͚ͳ͍ͷ Ͱɺྫ֎Λcatch͠ͳ͍ϝιουʹݶΔ •
όΠτίʔυͷσΟεύονʹ͏ϓϩάϥϜΧϯλͷ ૢ࡞͕ෆཁ • ߦ൪߸ΛऔΔϝιουݺͼग़͠ͷखલͰͲ͏ʹ͔෮׆ ͤ͞Δඞཁ͕͋Δ
࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠ ίϯύΠϥʹΑΔ࠷దԽ • ݱࡏओʹόΠτίʔυ໋ྩͷ࣮͕ੜίʔυ͔ΒΠ ϯϥΠϯԽՄೳ • ϦςϥϧͷͱόΠτίʔυ໋ྩͷ࣮ΛΠϯϥΠϯ Խ͢Δ͚ͩͰɺ1
+ 2 ʹର͠ 3 ΛੜͰ͖Δ • CͷίϯύΠϥؔαΠζ͕େ͖͍ͱΠϯϥΠϯԽ͠ ͳ͘ͳΔͷͰɺ໌ࣔతͳΠϯϥΠϯԽࢦఆ͕ඞཁͳ͜ ͱ
࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠ ίϯύΠϥʹΑΔ࠷దԽ ࣮ݧஈ֊ͷͷ: • RubyͰهड़͞ΕͨϝιουΠϯϥΠϯԽ͕؆୯ͳ͜ͱ Θ͔͍ͬͯΔ • શͯΛΠϯϥΠϯԽ͢ΔͱίϯύΠϧ͕࣌ؒ৳ͼΔͷͰɺ
Ͳ͜·ͰίϯύΠϧ͢Δ͔ݕ౼த • ϧʔϓͷΠϯϥΠϯԽ͕Ͱ͖Δͱޮ͕͘ɺϧʔϓ༻ϝιο υCͰ࣮͞Ε͓ͯΓɺগ࣮͕͠େม
࠷దԽ 3: ࣮ߦ࣌ͷใʹґଘͨ͠ ίʔυੜ • Կ͔ݺͼग़͠ࡁͷϝιουʹରͯ͠JITΛߦͳ͏ͷͰɺ JITίϯύΠϧ࣌ʹ࣮ߦ࣌ͷܕใ͕खʹೖΔ • ྫ: ϝιουݺͼग़͠ͷ໋ྩʹɺϝιουΩϟογϡ
ʹϨγʔόͷΫϥεใ͕͋Δɺ • ͦͷܕʹಛԽͯ͠ແବͳذΛআڈͨ͠ΓɺؒࢀরΛΠ ϯϥΠϯԽ͢ΔͳͲ͢ΔͱߴʹͳΔ
ੑೳධՁ
ϚΠΫϩϕϯνϚʔΫ: Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks JIT off ͱൺֱͨ͠ൺ 0
2 4 5 7 aread aref aset aw rte call const2 const fannk fib ivread ivw rite m andelbrot m eteor nbody nest-ntim es nest-w rite norm nsvb red-black sieve trees w hile 6.6 1.2 1.7 1.1 1.0 1.4 2.4 1.3 1.2 1.0 1.3 4.6 3.6 2.8 1.0 5.5 5.5 0.9 2.6 2.7 4.6 2.8 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 JIT off JIT on Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks Max Resident Set Size
(MB) 0 13 25 38 50 aread aref aset aw rte call const2 const fannk fib ivread ivw rite m andelbrot m eteor nest-ntim es nest-w hile norm nsvb w hile 38.2 43.7 38.3 42.1 38.3 44.2 45.1 38.3 38.2 38.3 38.3 38.3 38.2 38.3 38.3 38.3 38.3 38.3 14.4 14.5 14.9 14.2 14.4 15.3 14.2 14.3 14.4 14.3 15.0 14.2 14.2 14.8 14.2 14.3 14.3 14.4 JIT off JIT on Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks Max Resident Set Size
(MB) 0 100 200 300 400 red-black sieve trees 89.4 193.9 299.4 89.4 193.5 301.7 JIT off JIT on Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
ΞϓϦέʔγϣϯੑೳ 1: Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
Ruby 2.6.0 w/ NESΤϛϡϨʔλ Optcarrot Frames Per Second 0 23 45 68 90 86.6 53.8 JIT off JIT on
ΞϓϦέʔγϣϯੑೳ 1: ϝϞϦ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
Ruby 2.6.0 w/ NESΤϛϡϨʔλ Optcarrot Max Resident Set Size (MB) 0 16 32 48 64 63.7 62.8 JIT off JIT on
ΞϓϦέʔγϣϯੑೳ 2: Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
Ruby 2.6.0 w/ https://github.com/benchmark-driver/sinatra Request Per Second 0 2,125 4,250 6,375 8,500 7,466.5 8,442.1 JIT off JIT on
ΞϓϦέʔγϣϯੑೳ 2: ϝϞϦ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
Ruby 2.6.0 w/ https://github.com/benchmark-driver/sinatra Max Resident Set Size (MB) 0 18 35 53 70 64.4 23.7 JIT off JIT on
ੑೳิ Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu ʹ͓͍ͯɺ •
1ճͷJITίϯύΠϧʹ͔͔Δ࣌ؒ 60ʙ250 ms ఔ • JIT༗ޮʹ͢Δͱɺ࣮ࡍʹJIT͍ͯ͠ͳͯ͘ϐʔΫ࣌ϝϞϦফඅྔ ͕24ʙ28MBఔ૿͑Δ͕ɺϝιου1ͭ8KBͱ͔ͳͷͰޡࠩ • 24ʙ28MB෦ະௐࠪ: pthread, mutex, ϑϥάͷจࣈྻ, ...? • GCCͷϝϞϦফඅ: 4.6MBఔ, ClangͷϝϞϦফඅ: 24.1MBఔ • /tmp ͷফඅ1ϝιου͋ͨΓ࠷ .c 12KBɺ.o 4KBɺ.so 8KB
ࠓޙͷల WebΞϓϦέʔγϣϯʹ͓͚Δੑೳ্ʹϑΥʔΧε: • ࡉ͔͘ίϯύΠϧ͢ΔͱVMىಈճ͕૿͑ΔͷͰɺେ͖͘ ΠϯϥΠϯԽͯ͠·ͱΊͯίϯύΠϧ • খ͞ͳϝιουcaller͔ΒίϯύΠϧͯ͠ΠϯϥΠϯԽ • ͘Ͱ͖ͳͦ͞͏ͳϝιουίϯύΠϧ͠ͳ͍ɺ࠷దԽ ରͷબઓུΛվળ͢Δ
·ͱΊ • CίϯύΠϥΛͬͨJITख๏ͷτϨʔυΦϑΛઆ໌ͨ͠ • ίϯύΠϥࣗମͷϝϯςφϯε؆୯ʹͳΔ • ͦΕΛࢧ͑Δج൫ͷอक࣮ߦ࣌ͷڍಈෳࡶԽ͢Δ • Ruby 2.6JITʹΑΓCPUܭࢉத৺ͷ༻్Ͱ1.6ഒߴԽͨ͠
• খ͞ͳϝιου͕ͨ͘͞Μ͋Δ߹ͷੑೳվળத