因此,我在Heroku上的Rails 4.2应用程序中有一个方法,该方法正在ActiveAdmin中运行SQL语句,以获取100多万条计费记录的列表。
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
)
当我在rails生产控制台中通过Ruby的基准测试库对其进行基准测试时,大约需要2.1秒,如下所示:
user system total real
study_run: 0.000000 0.000000 0.000000 ( 0.002124)
如果我试图在rails生产控制台中运行some_method,控制台就会崩溃。那么,Ruby基准测试声称需要2.1秒,但当我在控制台中运行它时,我会崩溃,这是怎么回事呢?如果它崩溃了,我会认为实际测量的时间远高于2.1秒。
编辑:我用来进行基准测试的代码:
Benchmark.bm(10) do |r|
r.report("study_run:") { some_method }
end
您的方法生成一个ActiveRecord::Relation
,它基本上是一个表示查询的对象。创建关系并不执行它:您的基准测试只是测量创建该查询对象所需的时间,这自然只需要很短的时间。
当您从rails控制台运行此方法时,它仍然非常快速,但是控制台需要向您显示结果,因此它会在方法返回值上调用inspect
。这反过来又导致关系实际执行查询,这自然会比生成查询慢。