2016-09-07 6 views
0

私は、入力文字列が、私はそれが副作用を持たないのため、JITコンパイラは、tryブロック内のコードを削除しないであろうことを確認することができます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; 
} 

有効なXPathであるかどうかを確認するための簡単な方法がありますか?それとも(例外の可能性がありますか)?

+0

強制的にコンパイラ_not_に最適化を実行させる場合は、[this](http://stackoverflow.com/questions/5242405/how-to-make-sure-no-jvm-and-compiler- – byxor

答えて

5

デッドコードEliminatinoは、副作用だけでなく、計算結果の使用についてもあります。あなたのメソッドがtryブロックを実行せずに派生することができないisXpathを返すので、JITコンパイラがそれを排除することは不可能です。

+0

私は不可能とは言いません:JITが 'XPathFactory.newInstance()。newXPath()'をインライン化し、一定の伝播と同様の最適化により、コードが常に例外をスローするか、メソッド全体を 'CONSTを返す 'ように単純化します。実際には、それは不可能と私が同意することが合理的であることは非常にありそうもないでしょう。 – Voo

+0

有効なXPathが文字列でないか、またはそれらのすべてが存在するという仮定の下でのみ、コンパイラはそれを証明できます。明らかにここでは適用できません。 –

+1

文字列定数を使用するコールサイトのこの大文字小文字の区別があります。理論的には、呼び出しの戻り値を効果的にメモすることが可能になります。 –

関連する問題