2015-06-19 2 views
-2

Если я делаю что-то вроде следующего, считается ли это неоптимальным (производительность разумным)?Являются ли эти правильные оптимизации цикла?

// Is this optimal? 
foreach (var fruit in basket.Fruits()) 
{ 
    // .... 
} 

// What about this? 
for (var i = 0; i < basket.Fruits().length; ++i) { 
    // .... 
} 

// Alternate way. 
var fruits = basket.Fruits(); 
foreach (var fruit in fruits) 
{ 
    // .... 
} 

Im ищет ответы, применимые для .Net, а также Javascript.

спасибо.

+0

Создайте тест с 100000 фруктами и проверьте разницу во времени в обоих случаях. – BaBL86

+1

Я не думаю, что будет различие. компилятор сделает такую ​​оптимизацию. если вы думаете, что в первом цикле должны получить Фрукты в каждом итерации. нет, это не –

+2

Вопрос: вам нужны фрукты в вашей корзине позже? – MinusFour

ответ

2

Оба будут в равной степени исполнены. basket.Fruits() возвращает объект, и JavaScript создаст итератор для этого объекта.

Другим решением было бы использовать

Object.keys(basket.Fruits()).forEach(function(fruit) { 
    // ... 
}); 

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


В соответствии с вашим редактированием вы можете сохранить длину массива в переменной в выражении инициализации цикла. Тогда выражение предиката может сравнивать i<len вместо вычисления длины массива для каждой итерации.

for (var i=0; len=basket.Fruits().length; i<len; i++) ... 
+0

Что-то вроде этого: (см. Править выше). – AlvinfromDiaspar

+0

Благодарим вас за то, что вы ответили на вопрос лаконично, а не на «политику». – AlvinfromDiaspar

Смежные вопросы