Есть ли разница в производительности между этими двумя примерами кода? - PullRequest
1 голос
/ 13 июля 2010

Код ниже, кажется, делает то же самое, но у одного производительность выше, чем у другого, или они одинаковы? Спасибо.

Код 1:

<% @posts.each do |post| -%>  
post.doSomething
<% end -%>

Код 2:

<% for post in @posts %>
post.doSomething
<% end -%>

Ответы [ 6 ]

5 голосов
/ 13 июля 2010

Широко распространенным способом является использование each.Не только потому, что он более рубиновый, но и потому, что из Ruby 1.8.7+ each возвращает объект Enumerator , который можно использовать для создания magic интересных функциональных вещей.

Также: в случае сомнений, тест **

require "benchmark"

array = [*1..100_000]

Benchmark.bm(11) do |x|
  x.report("for .. in") { array.each{ |i| i.succ } }
  x.report("each")      { for i in array; i.succ; end }
end

** Если вы обнаружите, что прирост производительности в 0,00000001 наносекундах в вашем коде равенрелевантно, вероятно, вы не должны использовать Ruby в любом случае.

4 голосов
/ 13 июля 2010

В первом вы передаете код, который хотите выполнить для каждого элемента в массиве.Во втором вы перебираете код и делаете вещи.Функционально разницы нет.Идиоматически, rubyists будет выбирать API-интерфейсы в стиле функционального программирования каждый раз.Это вещь культуры.

Когда дело доходит до перфорации, вам не стоит потратить микрооптимизацию, если это не проблема.Все, что измеряется в миллисекундах, не должно рассматриваться как проблема, пока вы действительно не запустите профилировщик и не выясните, где ваш код на самом деле медленный.Большинству кода не нужно работать с максимальной эффективностью, производительность разработчика и удобство сопровождения гораздо важнее.

0 голосов
/ 13 июля 2010

Я не думаю, что между ними есть разница в производительности.

@posts.each выдает ошибку, когда массив @posts пуст или пуст, а for ... in не выдает ошибку.

Поэтому, если вы используете каждый из них, вы должны кодировать как

<% unless @posts.blank? %>
   <% @posts.each do |post| -%>  
      post.doSomething
   <% end -%>
<% end %>
0 голосов
/ 13 июля 2010

Производительность - разница должна быть незначительной, не о чем беспокоиться ... однако, есть разница в том, что каждый из них делает с переменной областью, см. https://gist.github.com/b07f6a11500693a2e181

0 голосов
/ 13 июля 2010

Вы можете использовать "break" внутри для .. in .. end:)

0 голосов
/ 13 июля 2010

Они чертовски эквивалентны, и влияние на производительность незначительно.Просто для стиля, который вы предпочитаете, и будьте последовательны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...