原始数组上的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上.
我的意见是你不知道也不应该猜.这些天试图超越编译器是徒劳的.
有些人曾经学过"模式"似乎可以优化某些操作,但在下一版本的Java中,这些模式实际上更慢.
始终尽可能清楚地写出来并且不要担心优化,直到你手中有一些用户规范并且无法满足某些要求,甚至在测试之前和之后要非常小心地运行以确保你的"修复"实际上改进了它,足以使该要求通过.
编译器可以做一些令人惊奇的东西,这些东西真的会让你大吃一惊,即使你做了一些迭代超过一个大范围的测试,如果你有一个较小的范围或改变循环内部发生的事情,它可能会完全不同.
及时编译意味着它偶尔可以胜过C,并且在某些情况下它没有理由不能胜过静态汇编语言(汇编不能事先确定不需要调用,Java有时可以做到这一点.
总结一下:你可以在代码中加入的最大价值就是把它写成可读的.