Rails: Сравнительный анализ запросов ActiveRecord для рельсов

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

User.find_by_name("Joe").id

против

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

Спасибо


person Splashlin    schedule 05.08.2010    source источник


Ответы (3)


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

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)

Таким образом, 2-й метод оказывается более быстрым, так как у него меньше работы. Конечно, вы должны протестировать это на своей производственной машине, используя производственную среду:

RAILS_ENV=production script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id"

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

person François Beausoleil    schedule 06.08.2010

Этот вопрос немного устарел и требует обновленного ответа. Самый простой способ протестировать запрос вне производственного сценария — запустить его в 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 верен, поскольку журнал показывает, как выполняется запрос, длинный не дает вы возражаете против времени построения, которое может быть меньше для вашего второго запроса, поскольку вы заполняете только одно поле по сравнению со всеми пользовательскими полями.

person Gavin Miller    schedule 02.11.2013
comment
Это должен быть выбранный ответ. - person webaholik; 15.09.2018

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

Ad Load (1.4ms)  SELECT "ads".* FROM "ads" ORDER BY created_at DESC
person Slobodan Kovacevic    schedule 05.08.2010
comment
Это сообщает о фактическом времени запроса в серверной части базы данных. Он не измеряет работу ORM, например, создание набора объектов для каждой записи. - person Dalibor Filus; 15.03.2014