Может ли java-компилятор устранить мертвый код из следующих сценариев?

(Вопрос № 0: компилятор Java устраняет мертвый код по умолчанию?)

Вопрос № 1: Предположим, у меня есть следующий фрагмент кода (который генерируется искусственно, поэтому я не контролирую его), сможет ли компилятор устранить мертвый код для меня?

    static void foo(final Object o)
    {
        if (o == null) {
            // do something
        }
        else {
            // do something

            if (o == null) { // this condition is never gonna be true
                // do something
            }
            else {
                // do something
            }
        }
    }

1 ответ

javac (по крайней мере, из OpenJDK) не устраняет мертвый код, за исключением веток констант во время компиляции, используемых для имитации условной компиляции других языков (см. пример в конце этого раздела JLS).

Однако оптимизирующие JVM очень умны. HotSpot (OpenJDK JIT) может распространять или не распространять o != null ограничение в этом коде, но через профилирование он заметит, что внутренний o == null test никогда не бывает верным и избегайте испускания кода для этой ветви (превращая его в необычную ловушку). И нулевые проверки, которые всегда наблюдались как ложные, действительно дешевы, потому что они складываются в инструкции по загрузке, используя segfaults для проверки на ноль; если ноль когда-либо замечен, JVM будет смотреть на адрес ошибочной инструкции, чтобы выбросить исключение NullPointerException из правильного места, и деоптимизировать в явную ветвь. (Подробнее о хитростях производительности в HotSpot читайте здесь.) Таким образом, даже если он не распространяет ограничение пути, он все равно эффективно удалит эту ветвь.

Если вас беспокоит производительность во время выполнения, вам не следует об этом беспокоиться, особенно в отсутствие информации о профилировании, указывающей на проблему.

Если вам просто нужны небольшие файлы.class, вам следует использовать оптимизатор, такой как ProGuard, хотя я не знаю, есть ли в нем анализ потока данных, необходимый для оптимизации этого конкретного шаблона.

Другие вопросы по тегам