了解避免死码消除的结果

时间:2016-11-25 11:19:19

标签: java jmh dead-code

我正在阅读JMH样本,现在我正在关于safe-looping的部分。这是一个例子:

@Benchmark
public void measureRight_2() {
    for (int x : xs) {
        sink(work(x));
    }
}

@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public static void sink(int v) {
    // IT IS VERY IMPORTANT TO MATCH THE SIGNATURE TO AVOID AUTOBOXING.
    // The method intentionally does nothing.
}

但是他们对这种技术提出了一个警告(强调我的)。

  

有时,将价值降入黑洞的成本是   主导纳米基准评分。在这些情况下,人们可能会尝试这样做   使用不可内联的方法制作移位“沉降片”。 这个技巧非常   特定于VM,只有在验证生成的时才能使用   代码(在处理纳米基准时,这是一个很好的策略   反正)。

我不太明白这里有什么特定的虚拟机。我们使用一种不应该内联的方法。因此无法优化计算。我错过了什么细节?

1 个答案:

答案 0 :(得分:3)

无法保证:

  1. 无内联提示正确传达给JVM;
  2. JVM不会故意忽略无内联提示;
  3. JVM不会意外忽略无内联提示;
  4. 无内联提示正在运行,但JVM采用跨方法优化,避免为已知的空方法准备参数;
  5. 无内联提示正在运行,但JVM采用了其他一些你在15分钟内无法想到的魔术优化;
  6. 这可能会从JVM系列更改为JVM系列,甚至可能在给定JVM系列的次要/修补程序版本中更改。这就是为什么它被称为特定于VM的原因,并且仅在您实际控制完全发生的事情时使用。