2013-07-19 1 views
0

У меня вопрос о оптимизации JIT. Я составил простой кусок кода:может JIT оптимизировать такой ненужный вызов?

class btest 
{ 
     static final boolean flag=false; 

     public final void foo(int x) 
     { 
       if(flag) {a=x; b=x*2; c=x*3;} 
     } 

     public void bar(int y) {foo(y);} 

     int a,b,c; 
}; 

flag установлен в false так foo() прекрасно компилируется в пустой код - просто возвращает. Но bar() все еще называет это.

Возможно ли, что JIT устранит этот звонок? Имеет значение, если flag принадлежит к внешнему классу?

рассматривает

ответ

4

Это может устранить его и встраивать его в коде.

Примечание: он также может делать это для энергонезависимых не конечных переменных, где он считает, что поток не изменяет значение. Распространенной ошибкой является чем-то вроде

boolean running = true; 

public void run() { 
    while(running) { 
     // do something 
    } 
} 

public void stop() { 
    running = false; 
} 

Распространенным заблуждением является то, что поток может продолжать работать в течение некоторое время, но останавливаться на какой-то неизвестной точке, когда на самом деле JIT может INLINE running и никогда не останавливаться.

+0

Почему просто не финальный? Не являются ли конечные переменные более открытыми для указанной оптимизации? – hexafraction

+0

@hexafraction Он будет делать это для примитивных конечных переменных и некоторых не конечных переменных. –

+0

Итак, вы думаете, что лучше использовать условную компиляцию if-s, завернутую в методы (например, мой пример) вместо if-s на верхнем уровне, что менее удобно и, вероятно, менее изящно? – ardabro

1

Компилятор JIT, скорее всего, сможет устранить это.

Но на самом деле, я думаю, что заявление if скорее всего будет оптимизировано до. Причина в JLS 14.21, начиная с того момента, когда это говорит, что это:

«Однако для того, чтобы, если заявление будет удобно использовать для„условной компиляции“целей, фактические правила отличаются.»

Если далее сказать, что компилятор (то есть байт-код компилятора!) Может генерировать различный код в вашем примере в зависимости от известного значения условия во время компиляции.

Обратите внимание, что эта специальная обработка применяется только к операциям if, и только если условие является постоянным выражением . (Этот термин имеет очень специфический смысл - см. JLS 15.28) Если вы попробовали один и тот же «трюк» с циклом while, например, вы получили бы ошибку компиляции, жалуясь на недостижимый код.

(Это «условная компиляция» специальная обработка восходит к заре Java и является частью обоснования Гослинга и др «ы решения не включать в себя препроцессор на языке Java.)

Смежные вопросы