Java性能:arraylength vs iload

vbe*_*nce 3 java performance assembly

for (int i=0; i<arr.length; i++) {
}
Run Code Online (Sandbox Code Playgroud)

这将导致代码:

getstatic   #4;
arraylength
Run Code Online (Sandbox Code Playgroud)

而以下代码:

int length = arr.length;
for (int i=0; i<length; i++) {
}
Run Code Online (Sandbox Code Playgroud)

将编译为:

iload_3
Run Code Online (Sandbox Code Playgroud)

两个片段之间有区别吗?哪个代码运行得更快?

如您所见,在我的情况下,数组是静态成员.静态和最终确切.考虑到JIT优化,基本优化器可以感知到并将数组的长度硬编码到方法的机器代码中.使用局部变量(第二种情况)遵循这种逻辑要困难得多,因此人们会认为第一种优化的可能性大于第二种情况.

Jon*_*eet 7

因为它是静态的和最终的,我怀疑它可以硬编码长度,虽然我不确定它会走得那么远.但是JIT编译器仍然可以使用第一种形式而不是第二种形式做得更好.

特别是,如果它可以检测到数组在循环内没有变化,它可以避免多次评估长度删除循环内的数组边界检查 - 它可以验证你永远不会访问外部的数组范围[0, length).

希望到现在为止,体面的JIT也会注意到第二种形式 - 但我仍然更喜欢第一种形式的可读性,而且我想要证明它在改变之前没有表现得好.

与以往一样,首先编写最易读的代码,但要根据性能要求进行测量.