メソッドのベンチを取る
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はなくなるのかもな。