Я использую следующую строку кода снова и снова в цикле:
Object val;
while (logic())
val = val == null ? generateObj() : val;
Мне любопытно, как JVM оптимизирует этот код, если вообще? Т.е., если val != null
будет ли JVM понимать, что присваивание возвращается к себе и просто игнорирует остальную часть строки, или потребуется время, чтобы скопировать ссылку val
на себя?
Я запускаю стандартные JRE 6 и JRE 7 в своих средах для Windows 7.
ASIDE: Если JVM не оптимизирует эту операцию очень хорошо, что является лучшей альтернативой для этого вызова? Просто if (val == null) val = generateObj();
?
Любопытно? Выберите несколько JVM (список из них доступен здесь: http://en.wikipedia.org/wiki/Java_Virtual_Machine) с открытым исходным кодом и отлаживать вывод компилятора JIT.
Я не знаю, были ли внутренние компоненты JVM Oracle (тот, который вы, вероятно, запускаете в Windows), открытыми исходными кодами, но, возможно, их инженеры могут четко ответить на ваш вопрос, особенно если вы загружаете билет с пропускной способностью (I используется для решения таких билетов для Symbian JVM (там их 2), и у нас были инструменты для подробного анализа этого рода вещей).
В общем, вопрос о том, как современная Java оптимизирует что-то, не имеет простого простого ответа. ИМХО лучший способ узнать больше - это выбрать один и поиграть с ним (запустить тесты, отслеживать исследования и т.д.),
Если вы спрашиваете, как писать лучший код, тогда это - супер-классный ответ - может дать вам несколько советов
EDIT: Есть ли руководство по настройке JDK для компиляции кода Java из компилятора C? (Идеально затмение)
Да, должен быть один. Просто имейте в виду, что работа с более крупными хранилищами программного обеспечения (тысячи файлов и от сотен тысяч до миллионов строк кода) обычно не для слабонервных, а для правильной настройки среды (даже с некоторой документацией) может занять несколько дней,
Википедия. Список виртуальных машин Java содержит список JVM с открытым исходным кодом. Страница JVM Oracle указывает на OpenJDK - The HotSpot Group, где вы можете найти некоторые (много) ресурсов и руководств, но в основном бесценные контакты с разработчиками, которые должны быть в состоянии помочь вам встать и работать.
(Я не могу предоставить вам более точные инструкции, поскольку я из бизнеса JVM и Symbian OS уже почти 5 лет, и все немного изменилось...)
Java - это интерпретируемый язык. Java в основном оптимизируется во время выполнения. Сгенерированный байт-код в целом полностью неоптимизирован. Только когда JVM выполняет байт-код, он начнет оптимизацию, в зависимости от того, как будет выполняться ваш код. Возможно, JVM ничего не оптимизирует, если ваш цикл работает всего пару раз. Вы никогда не можете точно сказать, будет ли JVM что-то оптимизировать или нет. Это также будет зависеть от конкретной реализации JVM. Поэтому вы никогда не должны полагаться на это.
if (val != null) val = generateObj();
?