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优化,基本优化器可以感知到并将数组的长度硬编码到方法的机器代码中.使用局部变量(第二种情况)遵循这种逻辑要困难得多,因此人们会认为第一种优化的可能性大于第二种情况.
因为它是静态的和最终的,我怀疑它可以硬编码长度,虽然我不确定它会走得那么远.但是JIT编译器仍然可以使用第一种形式而不是第二种形式做得更好.
特别是,如果它可以检测到数组在循环内没有变化,它可以避免多次评估长度并删除循环内的数组边界检查 - 它可以验证你永远不会访问外部的数组范围[0, length)
.
我希望到现在为止,体面的JIT也会注意到第二种形式 - 但我仍然更喜欢第一种形式的可读性,而且我想要证明它在改变之前没有表现得好.
与以往一样,首先编写最易读的代码,但要根据性能要求进行测量.
归档时间: |
|
查看次数: |
219 次 |
最近记录: |