Spl*_*lin 12 benchmarking activerecord ruby-on-rails
我想在我的应用程序中对我的几个ActiveRecord请求进行基准测试.控制台中最简单的方法是对基准测试进行基准测试
User.find_by_name("Joe").id
Run Code Online (Sandbox Code Playgroud)
与
User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id
Run Code Online (Sandbox Code Playgroud)
谢谢
Gav*_*ler 36
这个问题有点旧,需要更新的答案.在生产场景之外对查询进行基准测试的最简单方法是运行它rails console(基准测试脚本不再在Rails中了.)然后,您可以使用BenchmarkRuby内置的类进行测试.在Rails中运行以下命令:
puts Benchmark.measure { User.find_by_name("Joe").id }
puts Benchmark.measure { User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id }
Run Code Online (Sandbox Code Playgroud)
我将运行以上5次,丢弃最小值和最大值,并取其余三次运行的平均成本来确定哪个查询将为您提供更好的性能.
这是获得查询真实成本的最准确解决方案,因为Rails不会向您显示实际构建对象的成本.因此,虽然@Slobodan Kovacevic的答案是正确的,因为日志显示了查询所记录的日志,但是长时间没有给出对象构造时间,这对于第二个查询可能更少,因为您只填充单个字段而不是所有用户字段.
使用脚本/性能/基准测试:
script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id"
Run Code Online (Sandbox Code Playgroud)
在我的开发机器上,报告如下:
user system total real
#1 1.110000 0.070000 1.180000 ( 1.500366)
#2 0.800000 0.050000 0.850000 ( 1.078444)
Run Code Online (Sandbox Code Playgroud)
因此,第二种方法似乎更快,因为它要做的工作更少。当然,您应该使用生产环境在生产计算机上对此进行基准测试:
RAILS_ENV=production script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id"
Run Code Online (Sandbox Code Playgroud)
它可能会稍微改变你的情况。
| 归档时间: |
|
| 查看次数: |
7774 次 |
| 最近记录: |