Rails基准测试报告的时间少于activerecord查询

时间:2017-06-23 01:40:59

标签: ruby-on-rails activerecord

我试图对此查询进行基准测试:

Person.where(age: 60)

当我在控制台中运行时,它说:

  

人员负载(1.2ms)SELECT" people"。* FROM" people"在哪里"人们"。"年龄" =? [[" age",60]]

当我对它进行基准测试时,它会报告0.17ms

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

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

之间的差异是什么: 0.17ms (基准) VS 1.2ms (在控制台中运行命令时报告)

1 个答案:

答案 0 :(得分: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

这就是为什么你的基准测试错误 - 你测试查询创建而不是整个数据库请求。它应该看起来像:

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

然后在Console中尝试:

ct = ConsoleTest.new

ct = ConsoleTest.new; 1
ct.data

ConsoleTest.test_data