メソッドのベンチを取る

modelのインスタンスメソッドのベンチを取る

def test_method(arg)
  require 'benchmark'
   
  Benchmark.bm(12) do |x|
    x.report do
      1000.times do
        #実際の処理
      end
    end    
  end
end

後は、script/consoleからこのメソッドを実行。

付属機能を使ってもいい

ruby script/performance/benchmarker 1000 "TestModel.find(1).test_method('arg')"

プロファイリングする場合

ruby script/performance/profoler "TestModel.find(1).test_method('arg')" 1000


ちなみに、この時計測したのは、findクラスメソッド。ソートの関係で、多段の:include(つまいJOIN)をして、include対象テーブルのカラムでソートしていたのだが、これが結構重かった。JOINしてORDER BYも使っていたからなー。
JOINをやめて、findで各レコードを抽出した後に個々にJOINしてソートする方が早かった。

  • これは結構重い。
self.users.find(
                 :all,
                 :conditions => ["favorites.status IS NOT NULL"],
                 :order => "favorites.updated_at",
                 :include => {:flag => :favorite}
               )
  • 改善
users = self.users.find(
                         :all,
                         :conditions => ["favorites.status IS NOT NULL"],
                       )
users.sort{|a,b| a.get_favoirte.updated_at <=> b.get_favorite.updated_at}

前者だと、最初に全部JOINで持ってくるから思いのかも。後者だと、JOINするのは、結果として抽出するカラムに対してのみだから、無駄なJOINはなくなるのかもな。