Как современная Java оптимизирует самоопределение?

1

Я использую следующую строку кода снова и снова в цикле:

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(); ?

  • 6
    Любую причину (кроме любопытства) вы не написали if (val != null) val = generateObj(); ?
  • 0
    Нет нет. Этот вопрос о том, как работает Java. Я должен был добавить «Что было бы лучшей альтернативой, если JVM не оптимизирует это»
Показать ещё 8 комментариев
Теги:
optimization
memory
jvm

2 ответа

1
Лучший ответ

Любопытно? Выберите несколько 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 лет, и все немного изменилось...)

  • 0
    Есть ли руководство по настройке JDK для компиляции вашего кода Java из компилятора C? (В идеале затмение настроено)
1

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

  • 2
    Стоит отметить, что часто байт-код Java не интерпретируется, а JIT компилируется в машинный код
  • 0
    Существует множество оптимизаций, которые компилятор может выполнить задолго до того, как JVM увидит байт-код.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню