Контрольные рельсы ActiveRecord Queries - PullRequest
11 голосов
/ 06 августа 2010

Я хочу сравнить несколько моих запросов ActiveRecord в моем приложении.Какой самый простой способ использовать консоль для сравнения примерно как

User.find_by_name("Joe").id

против

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

Спасибо

Ответы [ 3 ]

35 голосов
/ 02 ноября 2013

Этот вопрос устарел и нуждается в обновленном ответе. Самый простой способ сравнить запрос за пределами производственного сценария - запустить его в rails console (сценарий бенчмаркера больше не поддерживается в Rails). Затем вы можете просто протестировать, используя класс Benchmark встроенный в Ruby. Запустите следующее в Rails:

puts Benchmark.measure { User.find_by_name("Joe").id }
puts Benchmark.measure { User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id }

Я бы выполнил вышеуказанное 5 раз, отбросил бы минимальное и максимальное значения и взял бы среднюю стоимость оставшихся трех запусков, чтобы выяснить, какой запрос даст вам более высокую производительность.

Это наиболее точное решение для получения истинной стоимости запроса, поскольку Rails не показывает стоимость фактического построения ваших объектов . Таким образом, хотя @ Slobodan Kovacevic ответ верен в том смысле, что в журнале показано, как журнал обрабатывает запрос, long не дает времени на создание объекта, которое может быть меньше для вашего второго запроса, поскольку вы только заполняете одно поле против всех пользовательских полей.

4 голосов
/ 06 августа 2010

В режиме разработки каждый запрос синхронизируется и регистрируется в log / development.log.У вас будут строки вроде:

Ad Load (1.4ms)  SELECT "ads".* FROM "ads" ORDER BY created_at DESC
1 голос
/ 06 августа 2010

Использовать скрипт / производительность / бенчмаркер:

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"

Это может немного изменить условия для вас.

...