【问题标题】:Does Java JIT compiler remove method's call without side effects?Java JIT 编译器是否在没有副作用的情况下删除方法调用?
【发布时间】:2016-09-07 21:38:58
【问题描述】:

我有一个简单的方法来检查输入字符串是否有效的 xpath

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 块内的代码,因为它没有副作用吗?或者它有(可能的例外)?

【问题讨论】:

  • 如果您想强制编译器执行任何优化,请查看this

标签: java jit


【解决方案1】:

Dead Code Eliminatino 不只是关于副作用,还关于使用计算结果。由于你的方法返回isXpath,不执行try块就无法导出,JIT编译器不可能消除它。

【讨论】:

  • 我不会说不可能:如果 JIT 内联 XPathFactory.newInstance().newXPath() 并且由于不断传播和类似的优化可以推断出代码要么总是抛出异常,要么永远不会,那么它可以简化整个方法到return CONST。在实践中,这是非常不可能的,我同意称之为不可能是合理的。
  • 只有在没有字符串是有效 XPath 或所有字符串都是有效 XPath 的假设下,编译器才能证明这一点。显然这里不适用。
  • 嗯,使用字符串常量的呼叫站点的这种边缘情况。那么理论上可以有效地记住调用的返回值。
  • 我在想在那里传递 say null 的思路,我假设这会抛出一个 NRE。
猜你喜欢
  • 2012-06-26
  • 2013-10-19
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
相关资源
最近更新 更多