Чтобы ответить на ваш вопрос (1), в принципе, компилятор Java может оптимизировать при наличии не встроенного вызова method1()
, , если , он проанализировал method1()
и определил, что он не ' У него нет побочных эффектов, которые могут повлиять на автоматическую векторизацию. В частности, компилятор может доказать, что метод был «постоянным» (без побочных эффектов и без чтения из глобальной памяти), что в целом позволило бы выполнить много оптимизаций на сайте вызова без встраивания. Возможно, это также может доказать более ограниченные свойства, такие как не чтение или запись в массивы определенного типа, что также будет достаточно для того, чтобы в этом случае происходила автоматическая векторизация.
На практике , однако, я не знаю ни одного компилятора Java, который может сделать эту оптимизацию сегодня. Если этот ответ , как полагают, в Hotspot: "вызов [not-inlined] метода обычно непрозрачен для JIT-компилятора." Большинство Java-компиляторов так или иначе основаны на Hotspot, так что я не ожидаю, что есть сложный Java-компилятор, который может это сделать, если Hotspot не может.
Этот ответ также охватывает некоторые причины, по которым такой межпроцедурный анализ (ПНД) может быть как сложным, так и не особенно полезным. В частности, методы, о которых можно доказать нетривиальные вещи, часто бывают достаточно малы, чтобы их в любом случае указывали. Я не уверен, полностью ли я согласен: можно также утверждать, что Java агрессивно частично использует , потому что не выполняет IPA, поэтому сильный IPA, возможно, откроет возможность делать меньше встроенных и, следовательно, уменьшит время выполнения. код и время JIT.
Другие варианты методов, о которых вы спрашиваете в (2) или (3), ничего не меняют: компилятору по-прежнему нужно, чтобы IPA разрешил его векторизацию, и, насколько я знаю, в компиляторах Java его нет.
(4) и (5) кажется, что их следует задавать как совершенно отдельные вопросы.
О (6) Я не думаю, что он изменился, но это могло бы послужить хорошим вопросом для списков рассылки точек доступа OpenJDK: думаю, вы получите хороший ответ.
Наконец, стоит отметить, что даже в отсутствие IPA и ничего не зная о method1()
, компилятор мог бы оптимизировать математические вычисления на a
, b
и c
, если бы мог доказать, что ни один из них не сбежал , Хотя это кажется довольно бесполезным в общем: это означало бы, что все эти переменные были бы распределены в этой функции (или какой-либо функции, встроенной в эту), тогда как я бы предположил, что в большинстве реалистичных сценариев по крайней мере одна из трех передается в вызывающим абонентом.