2017-08-21 48 views
7

我想推理如何JIT的热点原因。我最感兴趣的是最新的编译阶段(C2编译器)。 Java中的JIT是否依赖断言进行优化?如果是这样的话,我可以想象有些例子代码可以运行更快启用断言。Java,断言和JIT

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

static int getSumOfFirstThree(int[] array) { 
    assert(array.length >= 3); 
    return array[0] + array[1] + array[2]; 
} 
  • 请问JIT,当断言使能,足够聪明来消除边界检查在阵列存取?
  • 另外,还有其他情况下,你可以想到(实际与否)断言实际上会改善JIT将编译的本地代码?

回答

3

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

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

断言可以提高性能的例子就像这样。

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

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