以前の回答の後でも、あなたの質問に非常に興味がありました。だから私も自分でチェックすることにしました。私はこの小さなコードを書きました(数が素数であるかどうかをチェックすることについての数学の正しさを無視してください;-)):
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)であることがわかります。したがって、両方のループのパフォーマンスは同じであり、経過時間の変動は他のアプリケーションによるものであるという結論に達することができると思います(マシンのOS)。