java – 用于原始数组的现代for循环

前端之家收集整理的这篇文章主要介绍了java – 用于原始数组的现代for循环前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在原始数组上的for循环之间是否存在性能差异?

承担:

double[] doubleArray = new double[300000];


for (double var: doubleArray) 
   someComplexCalculation(var);

要么 :

for ( int i = 0,y = doubleArray.length; i < y; i++)
   someComplexCalculation(doubleArray[i]);

测试结果

我实际上是分析:

Total timeused for modern loop= 13269ms
Total timeused for old loop   = 15370ms

所以现代循环的运行速度更快,至少在我的Mac OSX JVM 1.5上.

解决方法

您的手写“旧”表单执行较少的指令,可能会更快,尽管您必须在给定的JIT编译器下配置文件以确定. “新”形式肯定不会更快.

如果您看到反汇编的代码(由Sun的JDK 1.5编译),您将看到“新”表单等效于以下代码

1: double[] tmp = doubleArray;
2: for (int i = 0,y = tmp.length; i < y; i++) {
3:   double var = tmp[i];
4:   someComplexCalculation(var);
5: }

所以,你可以看到使用更多的局部变量.在第1行的doubleArray到tmp的赋值是“extra”,但它不会发生在循环中,并且可能无法测量.第3行对var的赋值也是额外的.如果性能有差异,这将是负责任的.

第1行似乎是不必要的,但是如果在进入循环之前通过方法计算数组,则将其结果缓存.

也就是说,我将使用新的表单,除非您需要使用索引变量进行某些操作.在运行时,JIT编译器可能会优化任何性能差异,而新窗体更为清晰.如果您继续“手动”,您可能会错过未来的优化.一般来说,一个好的编译器可以优化“愚蠢”代码,但是在“智能”代码上绊倒.

原文链接:https://www.f2er.com/java/126659.html

猜你在找的Java相关文章