для цикла и в то время как в C # - PullRequest
20 голосов
/ 16 февраля 2009
for (i=0 ; i<=10; i++)
{
    ..
    ..
}

i=0;
while(i<=10)
{
    ..
    ..
    i++;
}

В цикле for и while, какой из них лучше, по производительности?

Ответы [ 6 ]

46 голосов
/ 16 февраля 2009

(обновление) На самом деле - есть один сценарий, в котором конструкция for более эффективна; зацикливание на массиве. Компилятор / JIT имеет оптимизацию для этого сценария , пока вы используете arr.Length в условии :

for(int i = 0 ; i < arr.Length ; i++) {
    Console.WriteLine(arr[i]); // skips bounds check
}

В этом очень специфическом случае он пропускает проверку границ, поскольку уже знает, что он никогда не выйдет за пределы. Интересно, что если вы «поднимете» arr.Length, чтобы попытаться оптимизировать его вручную, вы предотвратите это:

int len = arr.Length;
for(int i = 0 ; i < len ; i++) {
    Console.WriteLine(arr[i]); // performs bounds check
}

Однако для других контейнеров (List<T> и т. Д.) Подъем вполне оправдан в качестве ручной микрооптимизации.

(окончание обновления)


Ни; цикл for в любом случае рассматривается как цикл while под капотом.

Например, 12.3.3.9 из ECMA 334 (определенное назначение) диктует, что цикл for:

for ( for-initializer ; for-condition ; for-iterator ) embedded-statement

по существу эквивалентно (с точки зрения Определенное присваивание (не совсем то же самое, что сказать "компилятор должен генерировать этот IL")) как:

{
    for-initializer ;
    while ( for-condition ) {
        embedded-statement ;
        LLoop:
        for-iterator ;
    }
}

с операторами продолжения, которые нацелены заявление для перевода в заявления goto, нацеленные на ярлык Lloop. Если условие не указано из заявления, то оценка определенного задания поступает так, как если бы условия были заменено истинным в приведенном выше расширение.

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

12 голосов
/ 16 февраля 2009

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

6 голосов
/ 16 февраля 2009

Производительность будет такой же. Однако, если вам не нужен доступ к переменной i вне цикла, вам следует использовать цикл for. Это будет чище, поскольку i будет иметь только область видимости в блоке.

4 голосов
/ 18 февраля 2009

Эффективность программы зависит от правильных алгоритмов, хорошего объектного дизайна, умной архитектуры программ и т. Д.

Бритье цикла или двух с помощью циклов for против циклов НИКОГДА не будет делать медленную или быструю программу быстрой.

Если вы хотите улучшить производительность программы в этом разделе, найдите способ либо частично развернуть цикл (см. Устройство Даффа ), либо улучшить производительность того, что делается внутри цикла.

2 голосов
/ 16 февраля 2009

Ни один. Они эквивалентны. Вы можете думать, что цикл for является более компактным способом написания цикла while.

0 голосов
/ 16 февраля 2009

Да, они эквивалентны фрагментам кода.

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