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