我想要对我的应用程序中的一些ActiveRecord请求进行基准测试。在控制台中,最简单的方法是什么?
User.find_by_name("Joe").id
对比
User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id
感谢
我想要对我的应用程序中的一些ActiveRecord请求进行基准测试。在控制台中,最简单的方法是什么?
User.find_by_name("Joe").id
对比
User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id
感谢
这个问题有点老了,需要更新答案。在生产环境之外进行查询的最简单方法是在 rails console
中运行它(benchmarker脚本不再在Rails中)。然后您可以使用内置于Ruby中的 Benchmark
类进行测试。在Rails中运行以下命令:
puts Benchmark.measure { User.find_by_name("Joe").id }
puts Benchmark.measure { User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id }
我会执行上述步骤五次,舍弃最小值和最大值,然后取剩下三次运行的平均成本来确定哪个查询会给您更好的性能。
这是获取查询的真实成本的最准确解决方案,因为Rails不会显示构建对象的实际成本。因此,虽然@Slobodan Kovacevic的答案是正确的,因为日志会显示查询花费的时间,但是长时间不会为您提供对象构造时间,因为您仅填充单个字段而不是所有用户字段。
在开发模式下,每个查询都会计时并记录在log/development.log文件中。你会看到如下的行:
Ad Load (1.4ms) SELECT "ads".* FROM "ads" ORDER BY created_at DESC
script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id"
user system total real
#1 1.110000 0.070000 1.180000 ( 1.500366)
#2 0.800000 0.050000 0.850000 ( 1.078444)
RAILS_ENV=production script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id"
这可能会对您的情况产生一些改变。