Вы наверняка часто натыкались в сети на статьи о том, как оптимальнее использовать циклы. Многие вполне авторитетные источники (например, Bill Wagner в книжке Effective C#) заявляют, что использование array.Length в качестве условия окончания цикла более оптимально, нежели использование просто цифр или переменной. То есть вот так:
int[] testArray = new int[1000000];
int dim = testArray.Length;
for (int i = 0; i < dim; i++)
{
Console.WriteLine(testArray[i]);
}
//Предполагается, что компилятор сгенерирует вот такой код:
//
//for (int i = 0; i < dim; i++)
//{
// if (i < testArray.Length)
// testArray[i] = i;
// else
// throw new IndexOutOfRangeException();
//}
for (int i = 0; i < testArray.Length; i++)
{
testArray[i] = i;
}
Сегодня я решил потратить полчасика и проверить как дела обстоят на самом деле.
Компилировал под все версии фреймворков от 2.0 до 4.5. Правда на одной версии Visual Studio - 2012. Так вот, никакой разницы в производительности я не заметил. Возможно, если попробовать на 2010 или 2008 студии, то разница в производительности и будет, но на студиях 2012 и выше приведенные выше конструкции идентичны.
Вот такой код генерирует компилятор:
Компилировал под все версии фреймворков от 2.0 до 4.5. Правда на одной версии Visual Studio - 2012. Так вот, никакой разницы в производительности я не заметил. Возможно, если попробовать на 2010 или 2008 студии, то разница в производительности и будет, но на студиях 2012 и выше приведенные выше конструкции идентичны.
Вот такой код генерирует компилятор:
int[] numArray = new int[0x5f5e100];
int length = numArray.Length;
for (int i = 0; i < length; i++)
{
numArray[i] = i;
}
for (int j = 0; j < numArray.Length; j++)
{
numArray[j] = j;
}
PS. Хотя, да, второй вариант действительно на пару микросекунд быстрее, возможно из-за того, что доступ к свойству быстрее, чем доступ к переменной.
Комментариев нет:
Отправить комментарий