Pau*_*ton 5 java optimization jit
我一般写
for (int i = 0, n = someMethod(); i < n; i++)
Run Code Online (Sandbox Code Playgroud)
优先于
for (int i = 0; i < someMethod(); i++)
Run Code Online (Sandbox Code Playgroud)
避免someMethod() 重复计算.但是我不确定我什么时候需要这样做.Java在识别每次都会给出相同结果的方法时有多聪明,只需要在循环开始时执行一次?
据我所知,JIT 仅当它是一个相当简单的内联方法时才会检测到这一点。话虽这么说,程序员很容易检测到这些情况,但 JIT 编译器很难检测到。最好使用final int大型方法来缓存结果,因为 JIT 可以很容易地检测到该值无法更改,甚至可以删除数组访问检查以加速循环。
就像是
int[] arr = new int[ 10 ];
for( int i = 0; i < arr.length; i++ ) {
//...
}
Run Code Online (Sandbox Code Playgroud)
或者
List< String > list = Arrays.asList( new String[] { ... } );
for( int i = 0; i < list.size(); i++ ) {
//...
}
Run Code Online (Sandbox Code Playgroud)
可以很容易地通过 JIT 进行优化。调用大型或复杂方法的其他循环无法轻易证明总是返回相同的值,但像 size() 这样的方法可能可以内联甚至完全删除。
最后在数组上使用 for-each 循环。它们会衰减到我在数组的情况下发布的第一个循环,并且也可以轻松地进行优化以产生最快的循环。尽管 for-each 循环适用于非数组,但我更喜欢避免快速循环,因为它们会退化为迭代器循环,而不是我发布的第二个循环。对于 LinkedList 来说情况并非如此,因为由于 O( n ) 遍历,迭代器比使用 get() 更快。
这都是关于 JIT 可以做什么来优化循环的猜测。重要的是要知道 JIT 只会优化它可以证明不会改变最终效果的东西。保持事情简单将使 JIT 的工作变得更加容易。就像使用final关键字一样。在值或方法上使用final可以让JIT轻松证明它不会改变并且可以疯狂地内联。这就是 JIT 最重要的优化:内联。让这项工作变得简单,JIT 将为您提供很大帮助。
这是讨论循环优化的链接,其中如果 JIT 无法证明其优化不会改变任何内容,则 JIT 不能总是优化循环。
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |