即使在我之前的回答之后,我也对你的问题感到非常好奇。所以我决定自己也检查一下。我写了一小段代码(请忽略有关检查数字是否为素数的数学正确性;-)):
public class TestEnhancedFor {
public static void main(String args[]){
new TestEnhancedFor();
}
public TestEnhancedFor(){
int numberOfItems = 100000;
double[] items = getArrayOfItems(numberOfItems);
int repetitions = 0;
long start, end;
do {
start = System.currentTimeMillis();
doNormalFor(items);
end = System.currentTimeMillis();
System.out.printf("Normal For. Repetition %d: %d\n",
repetitions, end-start);
start = System.currentTimeMillis();
doEnhancedFor(items);
end = System.currentTimeMillis();
System.out.printf("Enhanced For. Repetition %d: %d\n\n",
repetitions, end-start);
} while (++repetitions < 5);
}
private double[] getArrayOfItems(int numberOfItems){
double[] items = new double[numberOfItems];
for (int i=0; i < numberOfItems; i++)
items[i] = i;
return items;
}
private void doSomeComplexCalculation(double item){
// check if item is prime number
for (int i = 3; i < item / 2; i+=2){
if ((item / i) == (int) (item / i)) break;
}
}
private void doNormalFor(double[] items){
for (int i = 0; i < items.length; i++)
doSomeComplexCalculation(items[i]);
}
private void doEnhancedFor(double[] items){
for (double item : items)
doSomeComplexCalculation(item);
}
}
运行该应用程序为我提供了以下结果:
正常的。重复 0:5594 增强。重复0:5594
正常的。重复1:5531增强。重复1:5547
正常的。重复 2:5532 增强。重复2:5578
正常的。重复 3:5531 增强。重复3:5531
正常的。重复 4:5547 增强。重复4:5532
我们可以看到,结果之间的差异非常小,有时正常循环运行得更快,有时增强循环更快。由于我的电脑中打开了其他应用程序,我觉得这很正常。此外,只有第一次执行比其他执行慢——我相信这与 JIT 优化有关。
正常循环的平均时间(不包括第一次重复)为 5535,25 毫秒,增强循环为 5547 毫秒。但是我们可以看到两个循环的最佳运行时间是相同的(5531ms),所以我认为我们可以得出结论,两个循环具有相同的性能——并且经过时间的变化是由于其他应用程序(甚至机器的操作系统)。