【问题标题】:Rails benchmark reports less time than activerecord queryRails 基准测试报告的时间少于 activerecord 查询
【发布时间】:2023-03-09 17:33:01
【问题描述】:
我正在尝试对这个查询进行基准测试:
Person.where(age: 60)
当我在控制台中运行它时,它会说:
人员负载 (1.2ms) SELECT "people".* FROM "people" WHERE "people"."age" = ? [[“年龄”,60]]
当我对其进行基准测试时,它会报告 0.17 毫秒
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(基准)
对比
1.2ms(在控制台运行命令时报告)
【问题讨论】:
标签:
ruby-on-rails
activerecord
【解决方案1】:
这段代码实际上并没有做数据库请求:
Person.where(age: 60)
它只是构建ActiveRecord::Relation。
您可以通过在控制台中逐行执行下一个代码并观察实际产生数据库请求的行来确保:
relation = Person.where(age: 60); 1
relation.class.name
relation.to_a
但是 Console 会用“Person Load ...”误导您,因为它会在每个代码行结果上调用像 #inspect 这样的附加方法。而这个额外的方法会导致数据库请求:
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
然后在控制台中尝试:
ct = ConsoleTest.new
和
ct = ConsoleTest.new; 1
ct.data
和
ConsoleTest.test_data