Микрооптимизация с локальной переменной длины контура?

Во многих языках программирования и их микрооптимизациях я видел, что объявление длины массива в цикле for влияет на производительность, особенно в PHP и JavaScript:

for i = 0, length = arr.length; i < length; ++i

Я видел, как этот формат используется в C ++, а также в некоторых исходных кодах Java. Верна ли эта микрооптимизация для всех языков программирования? Если это микро-оптимизация, не зависящая от языка, не следует ли ее оптимизировать уже из компиляторов?


person Gio Borje    schedule 09.04.2011    source источник


Ответы (2)


Ну, я думал, что компилятор Java позаботится об этой оптимизации, но это не так:

public static void main(String[] args) {
    String[] array = new String[10000000];
    Arrays.fill(array, "Test");
    long startNoSize = Calendar.getInstance().getTimeInMillis();
    for(int i=0; i< array.length;i++)
    {
        array[i]=String.valueOf(i+1);
    }
    long finishNoSize = Calendar.getInstance().getTimeInMillis();
    System.out.println(finishNoSize-startNoSize);
    System.out.println("Size saved");
    int length = array.length;
    long startSize = Calendar.getInstance().getTimeInMillis();
    for(int i=0; i< length;i++)
    {
        array[i]=String.valueOf(i+2);
    }
    long finishSize = Calendar.getInstance().getTimeInMillis();
    System.out.println(finishSize-startSize);
}

После нескольких последовательных прогонов результат будет таким:

6207
Size saved
4594

Таким образом, разница составляет 1500 миллисекунд.

ОБНОВЛЕНИЕ. Когда циклы меняются местами, результат тоже меняется :) Так что проблем с отсутствием оптимизации нет.

Таким образом, в Java вызов Container.size не влияет на производительность.

person StKiller    schedule 09.04.2011
comment
Тот же результат с моим компьютером, но, тем не менее, неверный. Поменяйте оба тестовых примера, и все будет с точностью до наоборот. Так что на самом деле это холодный напиток. - person Howard; 09.04.2011

Проблема для компилятора заключается в том, чтобы знать, что arr.length будет возвращать одно и то же на каждой итерации цикла. Иногда этого не происходит, например, когда тело цикла вставляет новые элементы в arr.

person Lindydancer    schedule 09.04.2011
comment
Я понимаю смысл не использовать этот формат, но это одна из наиболее распространенных реализаций цикла for для неизменяющих подпрограмм. Формат просто утомителен и распространяется на текстовые редакторы. Я надеялся, что хотя бы один компилятор смог бы это оптимизировать (циклы for-each произвольны, потому что они не гарантируют порядок). - person Gio Borje; 09.04.2011