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
67
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
バグを直したら useEffect が消えた
colorful12
3
700
リアルな遅延を測る仕様
kota_yata
1
130
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
180
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.2k
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
210
ソフトウェアラスタライザ
fadis
1
660
仕様駆動開発の消費期限
watany
20
9k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
280
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
210
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
150
Go 1.27 における memory allocation の高速化
andpad
0
320
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
330
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
The SEO Collaboration Effect
kristinabergwall1
1
530
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Speed Design
sergeychernyshev
33
2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Building Adaptive Systems
keathley
44
3.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
500
Building AI with AI
inesmontani
PRO
1
1.2k
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 😅