Rails: 对rails ActiveRecord查询进行基准测试

18

我想要对我的应用程序中的一些ActiveRecord请求进行基准测试。在控制台中,最简单的方法是什么?

User.find_by_name("Joe").id

对比

User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id

感谢

3个回答

62

这个问题有点老了,需要更新答案。在生产环境之外进行查询的最简单方法是在 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的答案是正确的,因为日志会显示查询花费的时间,但是长时间不会为您提供对象构造时间,因为您仅填充单个字段而不是所有用户字段。


这应该是被选中的答案。 - webaholik

4

在开发模式下,每个查询都会计时并记录在log/development.log文件中。你会看到如下的行:

Ad Load (1.4ms)  SELECT "ads".* FROM "ads" ORDER BY created_at DESC

3
该报告显示数据库服务器部分的实际查询时间。它不计算ORM工作,如为每个记录创建一堆对象。 - Dalibor Filus

3
使用 script/performance/benchmarker 工具:
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"

这可能会对您的情况产生一些改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接