2017-06-23 10 views
1

より少ない時間を報告します。Railsのベンチマークは、私はこのクエリのベンチマークにしようとしているのActiveRecordクエリ

Person.where(age: 60) 

私はコンソールでそれを実行すると、それは言う:

人ロード(1.2ms以上)を選択し* "people"から "people" "age" =? [[ "年齢"、60]]

私はベンチマークそれは、それは

def self.get_ages_sql 
    sixties = Person.where(age: 60) 
end 

Benchmark.bmbm do |x| 
x.report('sql') {Person.get_ages_sql} 
end 

いただきましdiscrepency間0.17msを報告

0.17ms(ベンチマーク) 対 1.2ms(コンソールでコマンドを実行すると報告されます)

答えて

2

このコードは実際にデータベースリクエストを行いません:

Person.where(age: 60) 

これはちょうどActiveRecord::Relationをビルドします。 あなたがコンソールにラインで次のコード行を実行することにより、確実とウィッヒラインを見ることができ、実際にDBリクエストを生成:

relation = Person.where(age: 60); 1 
relation.class.name 
relation.to_a 

しかし、それはそれぞれに#inspectのような追加のメソッドを呼び出すためコンソールが「...人のロード」をご誤解コード行結果。そして、この追加の方法は、DBリクエスト原因:

relation = Person.where(age: 60).inspect; 1 

をそして、あなたのベンチマークが間違っている理由です - あなたは、クエリの作成全体ではなくDB要求のテストを行います。

def self.get_ages_sql 
    Person.where(age: 60).to_a 
end 

追加:それはのようになりますコンソールで試行し

class ConsoleTest 
    def inspect 
    data.inspect 
    end 

    def data 
    'Doing DB request' 
    end 

    def self.test_data 
    ct = self.new 
    puts 'No request yet' 
    ct.data 
    end 
end 

を作成して、深いコンソールに取得するには:

ct = ConsoleTest.new 

ct = ConsoleTest.new; 1 
ct.data 

および

ConsoleTest.test_data 
関連する問題