Условная JIT-компиляция

В Java мы можем сделать условную компиляцию так

private static final boolean DO_CHECK = false;

...

if (DO_CHECK) {
   // code here
}

Компилятор увидит, что DO_CHECK всегда ложно, и удалит весь оператор if. Однако иногда, особенно в библиотечном коде, мы не можем использовать условную компиляцию, но мне интересно, можно ли использовать условную JIT-компиляцию?

 private final boolean doCheck;

 public LibraryClass(boolean d) {
    doCheck = d;
 }


 public void oftenCalledMethod() {
     if (doCheck) {
       ...
     }
 }

Если мы создадим LibraryClass с doCheck = false, удалит ли JIT-компилятор (в Hotspot) и оператор if?

Обновление: я только что понял, что JIT-компиляция, скорее всего, не выполняется на уровне экземпляра, поэтому я думаю, что это не сработает, но, может быть, есть статический способ?


person Bart van Heukelom    schedule 10.09.2010    source источник
comment
Можно задаться вопросом, каковы будут реальные преимущества этого - какова реальная стоимость с точки зрения системных ресурсов, если этот конкретный бит не подвергается JIT-обработке или не "оптимизируется" компилятором? Имеет ли значение размер исполняемого файла в программах Java? Увеличивается ли использование памяти, когда часть метода подвергается JIT-компиляции (если это правильный термин)?   -  person cthulhu    schedule 10.09.2010


Ответы (1)


JIT означает «точно вовремя». Это означает, что данные компилируются непосредственно перед тем, как виртуальная машина решит, что они ей нужны. Таким образом, в зависимости от уровня атомарности проверки вы можете обнаружить, что код, который никогда не запускается, никогда не компилируется JIT в любом случае.

person JeremyP    schedule 10.09.2010
comment
Код внутри if не будет скомпилирован, но мне интересно, оптимизирована ли сама проверка (которая может быть дорогой). - person Bart van Heukelom; 10.09.2010
comment
делать сравнение с логическим значением? Вряд ли это будет дорого. - person JeremyP; 10.09.2010