2016-09-07 4 views
0

У меня есть простой способ проверить, если строка ввода является действительным XPathКомпилятор Java JIT удаляет метод метода без побочных эффектов?

private boolean isXpath(String value) { 
    boolean isXpath = true; 
    try { 
     XPath xpath = XPathFactory.newInstance().newXPath(); 
     xpath.compile(value); 
    } catch (XPathExpressionException e) { 
     isXpath = false; 
    } 
    return isXpath; 
} 

Могу ли я быть уверен, что JIT компилятор не удаляет код внутри try блока, из-за этого не имеет никаких побочных эффектов? Или это (возможно исключение)?

+0

Если вы хотите, чтобы компилятор _not_ выполнял какие-либо оптимизации, просмотрите [это] (http://stackoverflow.com/questions/5242405/how-to-make-sure-no-jvm-and-compiler- оптимизация-возникает) – byxor

ответ

5

Мертвый код Eliminatino - это не только побочные эффекты, но и использование результатов вычислений. Поскольку ваш метод возвращает isXpath, который не может быть получен без выполнения блока try, компилятор JIT не сможет его устранить.

+0

Я бы не сказал, что невозможно: если JIT inlines 'XPathFactory.newInstance(). newXPath()' и из-за постоянного распространения и аналогичных оптимизаций может вывести, что код либо всегда выдает исключение, либо никогда, он мог бы затем упростите весь метод, чтобы «вернуть CONST». На практике это настолько маловероятно, что разумно назвать это невозможным, я согласен. – Voo

+0

Только в предположении, что никакая строка не является допустимым XPath, или все они есть, и компилятор может это доказать. Здесь явно не применимо. –

+1

Ну, там _is_ этот краевой случай сайта вызова, который использует строчную константу. Тогда теоретически можно было бы эффективно запоминать возвращаемое значение вызова. –

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