Вы наверняка часто натыкались в сети на статьи о том, как оптимальнее использовать циклы. Многие вполне авторитетные источники (например, 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. Хотя, да, второй вариант действительно на пару микросекунд быстрее, возможно из-за того, что доступ к свойству быстрее, чем доступ к переменной.
Комментариев нет:
Отправить комментарий