цикл for и while в С#

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

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

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


person Ashutosh Singh-MVP SharePoint    schedule 16.02.2009    source источник


Ответы (6)


(обновление) На самом деле - есть один сценарий, в котором конструкция 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 ;
    }
}

с операторами continue, которые нацелены на перевод оператора for, в операторы goto, нацеленные на метку LLoop. Если условие for опущено в операторе for, то оценка определенного присваивания выполняется так, как если бы условие for было заменено на true в приведенном выше расширении.

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

person Marc Gravell    schedule 16.02.2009
comment
Можете ли вы предоставить источники и цитаты для оптимизации разрывов длины подъема? - person Krythic; 07.05.2016
comment
@Krythic только что наткнулся на это: codeblog.jonskeet.uk/2009/01/29/ сообщение в блоге Джона Скита. - person Kevin Streicher; 29.01.2018
comment
NoxMortem Спасибо - person Krythic; 31.01.2018
comment
code2night.com/Tutorials/Article/Csharp-Tutorials вы можете изучить по ссылке. в этом блоге объяснение настолько ясно - person Shubham; 04.12.2020

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

person Alex Reitbort    schedule 16.02.2009

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

person Adam Ralph    schedule 16.02.2009

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

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

Если вы хотите повысить производительность программы в этом разделе, найдите способ либо частично развернуть цикл (см. Duff's Device) или повысить производительность того, что делается внутри цикла.

person abelenky    schedule 18.02.2009

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

person Ferdinand Beyer    schedule 16.02.2009

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

person crauscher    schedule 16.02.2009