How to profile your Rails and Ruby applications with ruby-prof

Installing ruby-prof -------------------- First install [ruby-prof]( ```ruby git clone git:// cd ruby-prof/ rake gem sudo gem install pkg/ruby-prof-0.6.1.gem ``` Note that version 0.6.0 doesn't work, at least not with Rails 2.1.1. With 0.6.0 I got this message: ```ruby gem install ruby-prof to use the profiler ``` Setting up a new environment for profiling ------------------------------------------ Create **config/environments/profiling.rb**: ```ruby config.cache_classes = true config.action_controller.consider_all_requests_local = false config.action_controller.perform_caching = true config.action_view.cache_template_loading = true #config.log_level = :debug ``` Add the new environment to database.yml. You might want to reuse the development database. Creating a profiling script --------------------------- Next we'll create a script that simply fetches the homepage, save the following code in **profiling/homepage.rb**: ```ruby get '/' say "GET / => #{path}" ``` Run the script -------------- Now run the script 100 times: ```ruby RAILS_ENV=profiling ./script/performance/request -n 100 profiling/homepage.rb ``` Profiling plain Ruby applications --------------------------------- You can also profile a block of code by [calling RubyProf from your code]( ```ruby require 'ruby-prof' # Profile the code RubyProf.start ... [code to profile] ... results = RubyProf.stop "#{RAILS_ROOT}/tmp/profile-graph.html", 'w' do |file| end "#{RAILS_ROOT}/tmp/profile-flat.txt", 'w' do |file| end "#{RAILS_ROOT}/tmp/", 'w' do |file| end ``` Analyzing results ----------------- I prefer to use the RubyProf::CallTreePrinter to output data that [kcachegrind]( can read. The HTML and text data is difficult to read so kcachegrind will definitely make your life easier. On OSX you can install kcachegrind with [Fink]( (or DarwinPorts): ```ruby sudo apt-get update ; sudo apt-get install fink sudo apt-get install kcachegrind ``` There's also WinCacheGrind and MacCacheGrind, but I haven't tried those.