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
5.4k
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
47
RubyKaigi 2025: Class New, A New Approach
tenderlove
0
260
Speeding up Instance Variables in Ruby 3.3
tenderlove
2
570
[Feature #20425] Speeding up delegate methods
tenderlove
3
360
RailsConf 2023
tenderlove
30
1.5k
Don't @ Me! Faster Instance Variables with Object Shapes
tenderlove
1
550
RailsConf 2022 Keynote
tenderlove
2
680
Some Assembly Required
tenderlove
1
640
HexDevs 2021
tenderlove
1
570
Other Decks in Programming
See All in Programming
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
180
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
150
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
210
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.2k
Agentic UI
manfredsteyer
PRO
0
180
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
720
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
280
JavaDoc 再入門
nagise
1
370
Featured
See All Featured
Music & Morning Musume
bryan
47
7.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
850
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
Art, The Web, and Tiny UX
lynnandtonic
304
22k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Visualization
eitanlees
152
17k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Raft: Consensus for Rubyists
vanstee
141
7.5k
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 😅