I'm trying to figure out what the best way to profile a Sinatra app is. I'd like a solution that would give me a time profile of all methods within a path, including the rendering of the haml.
Has anyone profiled a Sinatra app? Any pointers?
Here's a technique that works, not sure if it's the best.
require 'sinatra'
require 'profiler'
get '/' do
  Profiler__.start_profile
  do_it_fast
  do_it_slow
  do_it_fast
  Profiler__.stop_profile
  Profiler__.print_profile(STDOUT)
  "done"
end
def do_it_fast
  1.upto(100){ Math.sqrt(rand) }
end
def do_it_slow
  1.upto(100_000){ (Math.sqrt(rand)).ceil }
end
#=> In the console:
#=>  %   cumulative   self              self     total
#=> time   seconds   seconds    calls  ms/call  ms/call  name
#=> 68.45     2.82      2.82        3   940.00  1373.33  Integer#upto
#=> 11.41     3.29      0.47   100200     0.00     0.00  Kernel.rand
#=> 10.92     3.74      0.45   100000     0.00     0.00  Float#ceil
#=>  9.22     4.12      0.38   100200     0.00     0.00  Math.sqrt
#=>  0.00     4.12      0.00        2     0.00     5.00  Object#do_it_fast
#=>  0.00     4.12      0.00        1     0.00  4110.00  Object#do_it_slow
#=>  0.00     4.12      0.00        1     0.00  4120.00  #toplevel
IMO, in this case the best tool is perftools.rb, which is based on Google Perftools. It can even produce such graphs (awesome!): http://perftools-rb.rubyforge.org/examples/sinatra.gif
As a regular user of perftools.rb, I can say that it greatly helps to find bottlenecks in your app and compare different strategies.
Search for "perftools.rb" at github.com
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With