Skip to content

Instantly share code, notes, and snippets.

Avatar

Richard Schneeman schneems

View GitHub Profile
View minitest.rb
require 'minitest/mock'
class Foo
def foo
bar
end
def bar
end
View return-bench.rb
def early_return(val)
return val if val
"nope"
end
def compare_if(val)
if val
val
else
View master.bench.txt
10.791165 0.612941 11.447048 ( 12.321773)
10.392580 0.607349 11.042279 ( 11.851726)
10.735180 0.595994 11.372614 ( 12.300327)
10.429255 0.607993 11.079885 ( 11.984101)
10.636112 0.618988 11.289580 ( 12.239277)
10.350005 0.593711 10.986309 ( 11.958930)
10.278313 0.582329 10.912143 ( 12.399119)
10.326966 0.571871 10.933312 ( 11.845198)
10.623241 0.612042 11.281695 ( 12.252219)
10.419475 0.606360 11.061647 ( 12.021191)
View Tapbench.rb
require 'benchmark/ips'
MYARRAY = [["a", ["b", nil, "c", ["d"]]]]
Benchmark.ips do |x|
x.report("before") {
array = MYARRAY.dup
array.flatten!
array.uniq!
array.compact!
View faster-respond-to.txt
13.067572 0.813413 13.924595 ( 15.231642)
13.340035 0.831787 14.226155 ( 15.775059)
11.818412 0.738438 12.596999 ( 13.704238)
10.572116 0.637105 11.253312 ( 12.208787)
12.093575 0.718124 12.865758 ( 13.949344)
13.526131 0.871625 14.459032 ( 15.760837)
10.514290 0.640316 11.197930 ( 12.188919)
12.140994 0.763224 12.949930 ( 14.065164)
11.631830 0.716007 12.391399 ( 13.485287)
10.856942 0.671625 11.574060 ( 12.568493)
View &.try .rb
require 'benchmark/ips'
nil_case = nil
Benchmark.ips do |x|
x.report("nil &. ") { nil_case&.try(:foo) }
x.report("nil try") { nil_case.try(:foo) }
x.compare!
end
# Warming up --------------------------------------
View master.txt
11.783699 0.650146 12.467872 ( 13.422943)
12.104542 0.659909 12.797807 ( 13.718245)
11.925324 0.636579 12.592296 ( 13.490725)
11.299587 0.630098 11.970901 ( 12.859900)
11.325793 0.628691 11.995270 ( 13.114663)
11.342529 0.631052 12.004864 ( 12.916576)
11.387220 0.634889 12.053792 ( 12.978094)
11.400185 0.640076 12.078126 ( 13.021475)
11.412689 0.640065 12.083551 ( 13.011890)
11.363294 0.634647 12.028172 ( 12.959045)
View codetriage-bench.sh
git clone https://github.com/codetriage/codetriage
cd codetriage
bundle install
cp config/database.example.yml config/database.yml
NO_BOOTSNAP=1 bin/rake db:create db:schema:load db:seed
NO_BOOTSNAP=1 RAILS_ENV=production RAILS_SERVE_STATIC_FILES=1 RAILS_LOG_TO_STDOUT=1 bundle exec derailed exec perf:test
# Runs 5,000 requests against homepage
# output is in the form of Benchmark.benchmark
13.233374 0.872513 14.143397 ( 19.059944)
View rails new benchmark.sh
gem install rails
rails new foo
cd foo
rails generate controller welcome
cat <<EOT >> app/views/welcome/index.html.erb
<h2>Hello World</h2>
<p>
The time is now: <%= Time.now %>
</p>
View perf-regressions.md

I have monitoring set up via Heroku on memory/response times/etc. So if something major happened, I would find out about it pretty quickly.

Other than that, I just attack things that are slow. If a thing gets reintroduced that is slow and if it shows up in my metrics, then I attack it. Otherwise if it's not the slowest thing, I don't focus on it.

A general awareness of best practices and code reviews can help prevent slow things from going back into the codebase.

Writing notes about why you did perf changes might help, but it's a double edge sword. I replaced lots of things in sprockets that had a comment like "did this because it's faster". Maybe if you do leave a note like that, link to a benchmark so future employees can see if it's still the fastest, or see what other things were tried.