为什么Ruby基准测试让这个方法耗时2秒,但它在生产控制台中崩溃了



因此,我在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。这反过来又导致关系实际执行查询,这自然会比生成查询慢。

最新更新