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
[RailsConf 2024] From slow to go: Rails profili...
Search
Vladimir Dementyev
May 08, 2024
Programming
0
300
[RailsConf 2024] From slow to go: Rails profiling hands-on
https://evilmartians.com/events/from-slow-to-go-rails-test-profiling-hands-on-railsconf-2024
Vladimir Dementyev
May 08, 2024
Tweet
Share
More Decks by Vladimir Dementyev
See All by Vladimir Dementyev
[RubyKaigi 2024] Ruby Mixology 101: adding shots of PHP, Elixir, and more
palkan
2
730
[SF Ruby, March 2024] Rails on Wasm
palkan
4
870
[Sin City Ruby 2024] Seven deadly Rails anti-patterns
palkan
3
1.4k
[Helvetic Ruby 2023] Profiling Ruby tests with Swiss precision
palkan
0
1.1k
[RailsWorld 2023] Untangling cables & demystifying twisted transistors
palkan
1
2.3k
[RailsConf 2023] Rails as a piece of cake
palkan
48
4.6k
[RubyConf 2022] Weaving & seaming mocks
palkan
0
1.1k
[RailsConf 2022] The pitfalls of realtime-ification
palkan
0
7.7k
[RubyConf China 2021] HTML-over-WebSockets: From LiveView to Hotwire
palkan
2
1.1k
Other Decks in Programming
See All in Programming
LangChainの現在とv0.3にむけて
os1ma
4
880
いまから追い上げる、Jetpack Compose トレーニング
nyafunta9858
0
280
Scala におけるコンパイラエラーとの付き合い方
chencmd
2
410
React + TextAliveでカッコいいLyric Applicatioinを作ろう!!
tosuri13
0
400
How to Break into Reading Open Source
kaspth
1
200
1人で挑むSwiftコンパイラ 〜型システム入門編〜
s_shimotori
0
340
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
350
LangChainでWebサイトの内容取得やGitHubソースコード取得
shukob
0
160
令和トラベルにおけるLLM活用事例:社内ツール開発から得た学びと実践
ippo012
0
130
AndroidアプリのUIバリエーションをあの手この手で確認する / Check UI variations of Android apps by various means
tkmnzm
1
110
僕が思い描くTypeScriptの未来を勝手に先取りする
yukukotani
9
2.4k
私のEbitengineの第一歩
qt_luigi
0
440
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
89
16k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
Fantastic passwords and where to find them - at NoRuKo
philnash
48
2.8k
Web Components: a chance to create the future
zenorocha
308
42k
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
Building Better People: How to give real-time feedback that sticks.
wjessup
359
18k
Side Projects
sachag
451
42k
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
The Straight Up "How To Draw Better" Workshop
denniskardys
230
130k
Navigating Team Friction
lara
183
13k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Transcript
None
From slow to go: Rails test profiling hands-on Vladimir Dementyev
Evil Martians
palkan_tula palkan Why are we here? What's the plan? Who
are you? 3 Warming up Or waiting for everyone's dip rspec to pass
palkan_tula palkan You are here = = your tests are
slow 4
palkan_tula palkan Longer CI builds (also more expensive) Longer local
runs (or "local CI" builds) 5 Slow tests
palkan_tula palkan Longer CI builds (also more expensive) Longer local
runs (or "local CI" builds) Longer feedback loops More distraction, less productivity 6 Slow tests
palkan_tula palkan 🔍 Identify slowness causes and patterns 💊 Treat
them well 🔁 Repeat until satisfied 7 From slow to go
palkan_tula palkan 8
palkan_tula palkan Specialized profiler for Ruby test suites Optimization toolbox
to speed up tests with less refactoring 9 TestProf test-prof.evilmartians.io
palkan_tula palkan Used by GitHub, Discourse, Gitlab, Dev.to, and many
more Used by YOU at this workshop! 10 TestProf test-prof.evilmartians.io
11 github.com/palkan
12 evilmartians.com
13
palkan_tula palkan 14 X
palkan_tula palkan 15 Disclaimer: Mastodon team already did some test
performance work (via TestProf), so I had to revert a few optimizations in the workshop's version of the codebase (so we can have more fun)
palkan_tula palkan General profiling (Stackprof, Vernier, sampling) Focused profiling (TagProf,
EventProf) Factories overhead elimination (let_it_be) 16 The plan
palkan_tula palkan Local time: 8 : 30 ➡ 2 :
30 CI time: 14 : 30 ➡ 8 : 00 17 Results
palkan_tula palkan Rails tests occupy only for a portion of
a CI build time No need to optimize beyond other components 18 CI vs Rails tests
palkan_tula palkan General profiling 19
20
palkan_tula palkan Workshop instructions 21 # rails_helper.rb TestProf::EventProf.monitor( Paperclip::Attachment, 'paperclip.post_process',
:post_process )
palkan_tula palkan Workshop instructions 22 TAG_PROF=type \ TAG_PROF_FORMAT=html \ TAG_PROF_EVENT=sql.active_record,factory.create,
sidekiq.inline,paperclip.post_process \ be rspec
palkan_tula palkan Coverage: opt-out ➡ opt-in gem "debug", require: false
Webpacker: cache_manifest: true 23 Findings
palkan_tula palkan Logging—no effect when disk write is fast (SSD,
Docker volumes on Mac) Thousands of I18n YAMLs—handled by Bootsnap 24 Findings
25
palkan_tula palkan Do not require test-specific profiling skills Takes the
most significant amount of time (sampling helps) Highlights low-hanging fruits 26 General profiling
palkan_tula palkan Focused profiling 27
palkan_tula palkan Similar tests has similar problems Focus on most
time consuming test types, not individual outliers 28 Focused profiling
29
palkan_tula palkan Reduced the number of tests to analyze by
~2x Divided tests into smaller groups (~1min run time) for further analysis 30 Focused profiling
palkan_tula palkan TagProf EventProf RspecStamp (RSTAMP) 31 Tools
palkan_tula palkan Sidekiq: inline! ➡ fake! Paperclip::Testing.fake! 32 Findings
33
palkan_tula palkan Workshop instructions 34 # .rspec-local --tag ~paperclip:process
palkan_tula palkan 35 What's next?
palkan_tula palkan Factories 36
palkan_tula palkan 37 FPROF = 1 \ EVENT_PROF=factory.create \ be
rspec spec/models Workshop instructions
palkan_tula palkan Factory cascades Too many disposable records (no reuse
or recycle) Create vs. build 38 Factories vs. slow tests
39
palkan_tula palkan FactoryProf RSpecDissect before_all / let_it_be 40 Tools
palkan_tula palkan No cascades found Many tests share the same
context Reusing records between examples brings up to 6x speed up! 41 Findings
palkan_tula palkan Replacing let/let! with let_it_be works in ~90% of
tests The rest may require some refactoring (usually minor) 42 Findings
palkan_tula palkan Every file must be treated individually (routine) Extracting
shared contexts may help simplify future optimizations (e.g., adding fixtures) 43 Findings
palkan_tula palkan Homework 44
palkan_tula palkan Discover more TestProf tools (Autopilot, RuboCop cops, Factory
Doctor) Make YOUR tests faster Become a Mastodon contributor! 45 Homework
Thank you Visit TestProf and Evil Martians at the Hack
Day!