Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Building a toolkit to detect performance regres...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kir Shatrov
April 22, 2015
Programming
6.3k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Building a toolkit to detect performance regressions in Ruby on Rails core
My talk from RailsConf 2015.
Kir Shatrov
April 22, 2015
Transcript
93 slides
Kir Shatrov, RailsConf 2015 Building a toolkit to detect performance
regressions in Ruby on Rails core
@kirs @kirshatrov !"
None
Catching Performance Regressions in Rails
What’s a performance regression?
What’s a performance regression in Rails?
Page load 250ms → 4s
Case Study
4.2rc1
None
2 times slower
4.2rc3
Faster framework = Faster app
Examples from Rails commits
Metrics
Timing & Allocations
Faster Methods = Faster App
start = Time.now.to_f sleep 5 ends = Time.now puts "it
took #{ends - start}"
Allocations = GC work Less allocations = less GC work
before = GC.stat[:total_allocated_object] 10_000.times do { "key" => "value" }
end after = GC.stat[:total_allocated_object] puts "allocated: #{after - before}"
Basic primitives
Examples from Rails commits String
None
None
None
None
None
None
None
None
None
None
Examples from Rails commits Hash
None
None
None
None
None
None
Optimize only “hot” code
Track the changes
The Idea to build a service
Track it with benchmarks
Any existing benchmarks?
None
Setup Discourse Populate records Start Unicorn with RAILS_ENV=production Make requests
with Apache Bench to the list of endpoints Print timings and memory usage
Components to benchmark activerecord activemodel actionview actioncontroller activesupport
3.2 – 4.0 – 4.1 – 4.2
None
None
None
None
ActiveRecord Finders require_relative 'support/activerecord_base.rb' require_relative 'support/benchmark_rails.rb' User.create!(name: 'kir', email: '
[email protected]
')
m = Benchmark.rails(100, "activerecord/#{db_adapter}/finders") do User.find(1) end puts m.to_json
Disable GC is necessary Warm up the code Make N
iterations Calculate the mean timing and object allocations
ActiveRecord::Base#create require_relative 'support/activerecord_base.rb' require_relative 'support/benchmark_rails.rb' fields = { name: "Kir",
notes: "Note", created_at: Date.today } Benchmark.rails(1000, "activerecord/#{db_adapter}/create") do Exhibit.create(fields) end
Correct benchmarks
Full app benchmark
Full app benchmark before
stackprof by Aman Gupta github.com/tmm1/stackprof
4.2 4.1
config/environments/production.rb
Full app benchmark after
✅ Benchmarks
None
None
The Service
What do we want? See benchmark for every commit See
benchmark for every PR Report to PR author (“activerecord became 2% slower”) See charts
railsperf.evilmartians.io The prototype of the service. Built in January
rubybench.org by Sam Saffron and Guo Xiang Tan “Alan”
None
3.6GHz Intel® Xeon® E3-1270 v3 Quad-Core 4 x 8GB Micron
ECC Samsung SSD 845DC EVO - 240 GB Sponsored hardware
ruby-bench + rails
github.com/ruby/ruby webhook web app docker server benchmark suite
None
github.com/ruby-bench web app docker files benchmark suite
github.com/ruby-bench web app docker files benchmark suite
github.com/ruby-bench web app docker files benchmark suite
github.com/ruby-bench web app docker files benchmark suite
Results
Running builds for Rails
250k builds for Ruby
MRI performance regression caught
What’s next?
What’s next Pull Request benchmarks Weekly reports JRuby support
Overview What is a performance regression How to track them
How to solve them How to write benchmarks Automate tracking!
How to track your app performance? Study how do Ruby
objects work and how to treat them Write a Discourse-like benchmark and run it on Travis Subscribe to Rails Weekly
Ruby Under a Microscope
http://bit.ly/writing-fast-ruby
How to track your app performance? Study how do Ruby
objects work and how to treat them Write a Discourse-like benchmark and run it on Travis Subscribe to Rails Weekly
Setup the app Populate records Start Unicorn with RAILS_ENV=production Make
requests with Apache Bench to the list of endpoints Print timings and memory usage
How to track your app performance? Study how do Ruby
objects work and how to treat them Write a Discourse-like benchmark and run it on Travis Subscribe to Rails Weekly
bit.ly/railsperf-gh github.com/rubybench bit.ly/railsperf-static
Thanks! @kirs @kirshatrov @evilmartians evilmartians.com
More Decks by Kir Shatrov
See All by Kir Shatrov
Running Jobs at Scale
kirs
1
250
Operating Rails in Kubernetes
kirs
3
520
RailsClub 2016
kirs
2
340
Performance regressions in Ruby on Rails Core
kirs
0
250
Развертывание веб-приложений и фреймворк Capistrano
kirs
1
310
Capistrano 3
kirs
4
3.1k
Other Decks in Programming
See All in Programming
止まらない比較を止める — 余帰納法で無限ストリームを比べる
tarao
0
130
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
160
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
260
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
170
LLM 101
dalinaum
0
490
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
180
動画プレイヤーはなぜカクつくのか 〜Flutterのレンダリングとネイティブの境界を解剖する〜
naruogram
0
340
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
120
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
130
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
Distance field of Julia set
kinakomoti321
0
320
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.7k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.2k
Visualization
eitanlees
153
17k
Navigating Team Friction
lara
192
16k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3.1k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Six Lessons from altMBA
skipperchong
29
4.6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k