2010-07-13 2 views
1

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

Код 1:

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

Код 2:

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

Что является проблемой производительности вы испытываете? –

ответ

5

Широко распространенный способ использования each. Не только потому, что больше Ruby-ish, а потому, что из 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 наносекунд прирост производительности в своем коде, чтобы иметь отношение, вероятно, вы не должны использовать рубин так или иначе.

4

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

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

0

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

-2

Вы можете использовать «перерыв» внутри для .. в .. конец :)

0

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

0

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

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

Так что, если вы используете каждый следует кодировать как

<% unless @posts.blank? %> 
    <% @posts.each do |post| -%> 
     post.doSomething 
    <% end -%> 
<% end %> 
Смежные вопросы