for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
В циклах for и while, какой из них лучше с точки зрения производительности?
for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
В циклах for и while, какой из них лучше с точки зрения производительности?
(обновление) На самом деле - есть один сценарий, в котором конструкция 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 в приведенном выше расширении.
Это не означает, что компилятор должен делать то же самое, но на самом деле это почти так...
Я бы сказал, что они одинаковы, и вам все равно никогда не следует делать такие микрооптимизации.
Производительность будет такой же. Однако, если вам не нужно обращаться к переменной i
вне цикла, вам следует использовать цикл for
. Это будет чище, так как i
будет иметь область действия только внутри блока.
Эффективность программы зависит от правильных алгоритмов, хорошего объектного дизайна, продуманной архитектуры программы и т. д.
Сокращение одного или двух циклов с помощью циклов for и циклов while НИКОГДА не сделает медленную программу быстрой, а быструю программу медленной.
Если вы хотите повысить производительность программы в этом разделе, найдите способ либо частично развернуть цикл (см. Duff's Device) или повысить производительность того, что делается внутри цикла.
Ни один. Они эквивалентны. Вы можете думать о цикле for как о более компактном способе написания цикла while.
Да, это эквивалентные фрагменты кода.