Объявить один раз против повторного объявления - PullRequest
1 голос
/ 28 марта 2020

Представьте себе функцию в этих версиях:

    static int fibonacciIterative(int n) {
        int previous = 0;
        int current = 1;
        for (int i = 1; i < n; i++) {
            int temp = current;
            current += previous;
            previous = temp;
        }
        return current;
    }
    static int fibonacciIterative(int n) {
        int previous = 0;
        int current = 1;
        int temp;
        for (int i = 1; i < n; i++) {
            temp = current;
            current += previous;
            previous = temp;
        }
        return current;
    }

Единственное отличие состоит в том, что переменная temp объявляется снова и снова в l oop первая версия, в то время как она объявлена ​​ один раз вне l oop во второй версии. Есть ли разница в результирующем байт-коде, независимо от его значимости? Как компилятор обрабатывает такие случаи и может ли вторая версия рассматриваться как оптимизированная первая версия?

1 Ответ

5 голосов
/ 28 марта 2020

Переменные вообще не объявляются на уровне байт-кода (игнорируя обычные предостережения о метаданных отладки). Вместо этого каждый метод имеет таблицу до 65 535 «слотов», из которой байт-код может хранить и извлекать значения. Компилятор назначит каждой переменной слот, следя за тем, чтобы не использовать слоты для переменных с перекрывающимися диапазонами жизнеспособности.

Так что в вашем примере я бы ожидал, что единственная разница заключается в том, что temp и i получают назначенные слоты в другом порядке, но в остальном байт-код идентичен.

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

...