2016-12-07 2 views
0

Использование Benchmark ips Я проверил это испытание. Исправьте меня, если я ошибаюсь в том, что я только что испытал. Обратите внимание, что 96 - это идентификатор первого пользователя в моем db.Rails 5 - первый раз, где предел 1 против

Benchmark.ips do |x| 
    x.report("first") do 
    User.first 
    end 
    x.report("where") do 
    User.where(id: 96).limit(1) 
    end 
    x.report("find") do 
    User.find(96) 
    end 
    x.compare! 
end 

Я побежал этот тест несколько раз и получил это как результат

Comparison: 
       where: 26430.8 i/s 
       first:  999.8 i/s - 26.44x slower 
       find:  964.3 i/s - 27.41x slower 

Моего conclussion это всегда использовать, где вместо того, чтобы найти или первое, поскольку они гораздо медленнее способы получить конкретный пользователь ,

Rails 5.0.0.1, PostgreSQL 9.5.3, Ruby 2.3.1

+3

На самом деле вы не выполняете запрос «где». Вероятно, если вы добавите '.to_a' до конца, он действительно запустится. –

ответ

1

Как Майкл Chaney указывает в комментариях, линии

User.where(id: 96).limit(1) 

не выполняет запрос, он просто строит ActiveRecord_Relation, который выполняется только при попытке доступа к записи пользователя, к которой он относится.

Вот почему вы можете создать запрос по нескольким линиям с минимальным влиянием на производительность

@users = User.where(type: 'admin') 
    @users = @users.where(status: 'enabled') 

Это только тогда, когда вы перебирать @users, что запрос с where"type = 'admin AND status = 'enabled'" статье рассматриваются Исполняет.

Повторите тесты, но, как предлагает Майкл, измените отношение на массив, который выполнит запрос.

User.where(id: 96).limit(1).to_a 
+0

ahhh. Это и сейчас цифры более точны =) Сравнение: first: 986.6 i/s find: 940.7 i/s - same-ish: разница попадает в погрешность где: 931.6 i/s - same-ish: разница находится в пределах ошибки – Philip