【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多