Java для оценки цикла - PullRequest
       26

Java для оценки цикла

11 голосов
/ 07 октября 2010

Я хочу знать, выполняется ли оценка условия в циклах for и while в Java каждый раз, когда цикл завершается.

Пример:

int[] tenBig = new int[]{1,2,3,4,5,6,7,8,9,10};

for(int index = 0;index < tenBig.length;index++){
    System.out.println("Value at index: "+tenBig[index]);
}

Будет лиindex < tenBig.length будет выполняться каждый раз, когда цикл цикла завершается?

Предположение и опыт говорят мне, что да.

Я знаю, что в этом примере tenBig.length является константой, поэтому не будетбудет влиять на производительность.

Но давайте предположим, что операция условия занимает много времени в другом случае.Я знаю, что логичным решением будет присвоить tenBig.length переменной.

Тем не менее, я хочу быть уверен, что она вычисляется каждый раз.

Ответы [ 8 ]

11 голосов
/ 07 октября 2010

Да, он будет логически оценивать весь средний операнд на каждой итерации цикла.В случаях, когда JIT знает лучше, конечно, он может делать умные вещи (даже потенциально удаляя проверку границ массива в цикле, основываясь на условиях цикла).

Обратите внимание, что для типов, которые JIT не делает 'Не знаю, возможно, он не сможет оптимизировать определенным образом, как это, но все же может включать в себя такие вещи, как извлечение size() из ArrayList<T>.

Наконец, я обычно предпочитаю расширенный цикл for для удобства чтения:

for (int value : tenBig) {
    ...
}

Конечно, предполагается, что вам не нужен индекс по другим причинам.

6 голосов
/ 07 октября 2010

Да.В частности, условная часть выполняется перед каждым телом цикла.Поэтому вполне возможно, что вы вообще никогда не будете вводить тело цикла.

Итак, взяв ваш пример:

for(int index = 0;index < tenBig.lenght;index++) {
    /* ...body... */
}

Это логический (не буквальный) эквивалент:

int index = 0;
while (index < tenBig.length) { // happens on each loop
    /* ...body... */

    index++;
}
3 голосов
/ 07 октября 2010

Да, выражение должно оцениваться для каждой итерации цикла, чтобы определить, оставаться ли внутри цикла или продолжать выполнение программы.

Помните, что вы можете делать такие вещи:

for(int a = 0, z = 26; a < z; a++, z--){
    // Do some work
}

В этом случае обе стороны выражения будут меняться и должны оцениваться для каждой итерации.

И вы правы, если у вас есть расчеты в условии цикла for, которые можно перенести в отдельную переменную, вы должны сделать это:

for(int i = 0; i < ((someCount / 2) * 21.6); i++){
}

Может быть легко:

int maxVal = (someCount / 2) * 21.6;

for(int i=0; i < maxVal; i++){
{
1 голос
/ 07 октября 2010

index < tenBig.length будет выполняться перед каждым началом цикла цикла.

    public static void main(String[] args) {
        int[] tenBig = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        for (int index = 0; isEvaluated() && index < tenBig.length; index++) {
            System.out.println("Value at index: " + tenBig[index]);
        }
    }

    public static boolean isEvaluated() {
        System.out.println("evaluated");
        return true;
    }

Будет напечатано "evaluated" непосредственно перед началом циклов. И еще один раз до окончания цикла.

1 голос
/ 07 октября 2010

Вот несколько байт-кодов примеров компиляции из спецификации JVM .

Насколько я знаю, условие будет оцениваться каждый раз.

С уважением.

1 голос
/ 07 октября 2010

Если условное выражение является инвариантом цикла , и вы работаете в режиме JIT, можно выполнить оптимизацию цикла, например Движение кода по инварианту цикла .Но когда я запускаю в интерпретированном режиме, я думаю не так много оптимизации.

0 голосов
/ 07 октября 2010

Он будет выполняться каждый раз при входе в цикл, включая последнюю оценку, которая даст индекс

0 голосов
/ 07 октября 2010

Вы спрашиваете, кеширует ли компилятор значение tenBig.length, поскольку он знает, что оно не изменится во время цикла?Или вы спрашиваете, знает ли компилятор, что весь индекс выражения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...