【问题标题】:Java, Assertions and the JITJava、断言和 JIT
【发布时间】:2017-08-21 18:07:16
【问题描述】:

我试图解释 Hotspot 的 JIT 是如何推理的。我最感兴趣的是最新的编译阶段(C2 编译器)。 Java 中的 JIT 是否依赖断言进行优化?如果是这样的话,我可以想象在启用断言的情况下代码可以更快运行的示例。

例如,在这样的一段代码中:

static int getSumOfFirstThree(int[] array) {
   assert(array.length >= 3);
   return array[0] + array[1] + array[2];
}
  • 在启用断言时,JIT 是否足够聪明,可以消除对数组访问的边界检查?
  • 或者,您是否可以想到其他情况(无论是否实际),断言实际上会改进 JIT 将编译的本机代码?

【问题讨论】:

    标签: java jit


    【解决方案1】:

    在这种情况下,需要进行多项边界检查,并且 JIT 可以合并它们以便只进行一次检查,但是断言并不能避免进行检查。

    断言会阻止像内联这样的优化,因为方法更大,并且大小是决定是否内联方法的一个因素。内联通常会提高性能,但在某些情况下并不能提高性能,因为它会导致 L0 或 L1 CPU 缓存由于生成的代码较大而变得低效。

    断言可以提高性能的一个例子是这样的。

    boolean assertionOn = false;
    assert assertionOn = true;
    if (assertionOn) {
       assumeDataIsGood(); // due to checks elsewhere
    } else {
       expensiveCheckThatDataMightNotBeGood();
    }
    

    这可能是使用断言的反模式,但使用意图断言会更便宜。

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 2014-08-17
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      相关资源
      最近更新 更多