воскресенье, 16 марта 2014 г.

Про скорость циклов for

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

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

Комментариев нет:

Отправить комментарий