在原始数组上的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编译器可能会优化任何性能差异,而新窗体更为清晰.如果您继续“手动”,您可能会错过未来的优化.一般来说,一个好的编译器可以优化“愚蠢”代码,但是在“智能”代码上绊倒.