2016-04-12 3 views
0

私は、HerokuのRails 4.2アプリで、ActiveAdminでSQLステートメントを実行して100万件以上の請求レコードのリストを取得する方法を持っています。Rubyのベンチマークでは2秒かかるのですが、本番コンソールでクラッシュするのはなぜですか?

   user  system  total  real 
study_run: 0.000000 0.000000 0.000000 ( 0.002124) 

私はsome_methodを実行しよう:私はレールの生産コンソールでのRubyのベンチマークライブラリを介して、その上でベンチマークを行うと、私は次のように周りに2.1秒を取ってもらう

def some_method 
     BillingRecord.select(<<-SQL.sub(/\n$/, '') 
billing_records.first_name as name, 
billing_records.email as email 
    #some more sql with joins 
SQL 
) 

レール製作コンソール、コンソールがクラッシュするだけです。だからRubyのベンチマークは2.1秒だと主張していますが、コンソールで実行するとクラッシュするのですか?それがクラッシュしていると私はの実数の測定時間が2.1秒をはるかに上回っていると思います。

編集:私はベンチマークに使用されるコード:

Benchmark.bm(10) do |r| 
    r.report("study_run:") { some_method } 
end 
+3

2.1秒ではなく、2.1ミリ秒です。私はあなたのベンチマークに何か問題があるかもしれないと思うか、または1M行を検索するために2.1ミリ秒が雷の速さになるので、生産と同じ数のレコードを取得していないと思います。 – engineersmnky

+0

はい、それは私が理解しようとしていることです... – Nona

+0

あなたのベンチマークはどのように見えますか? –

答えて

1

あなたの方法は、基本的には、クエリを表すオブジェクトであるActiveRecord::Relationを生成します。リレーションシップを作成してもそれを実行することはできません。ベンチマークは、クエリオブジェクトの作成にかかる時間を測定することに過ぎず、自然にわずかな時間しかかかりません。

このメソッドをレールコンソールから実行すると、それでもまだ非常に速いですが、コンソールは結果を表示してメソッドの戻り値としてinspectを呼び出す必要があります。これにより、関係が実際にクエリを実行し、自然にクエリを生成するよりも遅くなります。

関連する問題