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
RubyKaigi Dev Meeting 2025
Search
Aaron Patterson
April 15, 2025
Programming
6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RubyKaigi Dev Meeting 2025
Aaron Patterson
April 15, 2025
More Decks by Aaron Patterson
See All by Aaron Patterson
Faster FFI for Ruby
tenderlove
0
68
RubyKaigi 2025: Class New, A New Approach
tenderlove
0
280
Speeding up Instance Variables in Ruby 3.3
tenderlove
2
590
[Feature #20425] Speeding up delegate methods
tenderlove
3
380
RailsConf 2023
tenderlove
30
1.5k
Don't @ Me! Faster Instance Variables with Object Shapes
tenderlove
1
570
RailsConf 2022 Keynote
tenderlove
2
690
Some Assembly Required
tenderlove
1
660
HexDevs 2021
tenderlove
1
580
Other Decks in Programming
See All in Programming
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
520
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
180
Dockerfile CMD for Node.js
grazie1999
0
140
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
110
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
740
Deep dive into the select statement (GopherCon UK)
jespino
0
150
VibeCodingからAgenticWorkflowへ
starfish719
0
920
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
120
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
390
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
300
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
310
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
The agentic SEO stack - context over prompts
schlessera
0
880
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
580
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Facilitating Awesome Meetings
lara
57
7.1k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
500
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Odyssey Design
rkendrick25
PRO
2
780
It's Worth the Effort
3n
188
29k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Transcript
Inline Class#new Feature #21254
Implement Class#new in Ruby class Class def new(...) Primitive.attr! :c_trace
Primitive.pop!( Primitive.send_delegate!( Primitive.dup!(Primitive.rb_class_alloc2), :initialize, ...)) end end class BasicObject def initialize Primitive.attr! :c_trace nil end end
Class#new ➡ Ruby
Inline Class#new Feature #21254
Instructions
Before > ruby --dump=insns -e'Object.new' == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,10)> 0000
opt_getconstant_path <ic:0 Object> ( 1)[Li] 0002 opt_send_without_block <calldata!mid:new, argc:0, ARGS_SIMPLE> 0004 leave
After > ./miniruby --dump=insns -e'Object.new' == disasm: #<ISeq:<main>@-e:1 (1,0)-(1,10)> 0000
opt_getconstant_path <ic:0 Object> ( 1)[Li] 0002 putnil 0003 swap 0004 opt_new <calldata!mid:new, argc:0, ARGS_SIMPLE>, 11 0007 opt_send_without_block <calldata!mid:initialize, argc:0, FCALL|ARGS_SIMPLE> 0009 jump 14 0011 opt_send_without_block <calldata!mid:new, argc:0, ARGS_SIMPLE> 0013 swap 0014 pop 0015 leave
Speedup
Positional Parameters Allocations per Second by Ruby version Allocations Per
Second 0 9500000 19000000 28500000 38000000 Number of Parameters 0 1 2 3 4 5 6 7 8 9 10 Ruby 3.5 + inlining Ruby 3.4
~1.8x Faster
Keyword Parameters Allocations per second by Ruby version Allocations Per
Second 0 10000000 20000000 30000000 40000000 Number of Parameters 0 1 2 3 4 5 6 7 8 9 10 Ruby 3.5+inlining Ruby 3.4
3 Keyword Params: 3.2x faster
10 Keyword Params: 6.2x faster
Positional Parameters + Varied Classes Allocations per second by Ruby
version (varying allocated class) Allocations per Second 0 9500000 19000000 28500000 38000000 Number of Parameters 0 1 2 3 4 5 6 7 8 9 10 Ruby 3.5+Inlining Ruby 3.4
Keyword Parameters + Varied Classes Allocations per second by Ruby
version (varying allocated class) Allocations Per Second 0 10000000 20000000 30000000 40000000 Number of Parameters 0 1 2 3 4 5 6 7 8 9 10 Ruby 3.5+Inlining Ruby 3.4
Downsides
More memory
Measure ISeq size How many bytes does the “alloc” method
use? require "objspace" def alloc Object.new end m = method(:alloc) insn = RubyVM::InstructionSequence.of(insn) puts ObjectSpace.memsize_of(insn) Ruby 3.5 + inlining: 656 bytes Ruby 3.4: 544 bytes +122 Bytes
Real World Memory Increase (ISeq Only) 0.5% Increase in ISeq
Size (Ruby 3.4.2 vs 3.5.0+inline) irb(main):001> 737191972 - 733354388 => 3837584 Shopify M onolith ISeq Sizes
Real World Memory Increase (all memory) 1mb increase total (~4GB
heap) irb(main):001> 3981075617 - 3979926505 => 1149112 Shopify M onolith Total H eap
Different Stack Trace
Stack Trace is Different Class#new is missing class Foo def
initialize puts caller end end def hello Foo.new end hello > ruby test.rb test.rb:8:in 'Class#new' test.rb:8:in 'Object#hello' test.rb:11:in '<main>' Ruby 3.4 > ./ruby test.rb test.rb:8:in 'Object#hello' test.rb:11:in '<main>' Ruby 3.5 + inlining
No Test Failures 😅