[for
ループとforeach
ループと範囲]
for
10 万回以上の反復でループとforeach
ループを比較しましたrange
。テスト結果は、ループの実行がループfor
よりもforeach
高速であることを示しています。
その理由は、for
ループが整数値をインクリメントすることによって比較を実行するためです。対照的に、foreach
および はrange
、各要素を抽出して配列の終わりをチェックする前に、配列を作成する必要があります。
<?php
$time_one = microtime(true);
for ($i=0; $i < 100000; $i++) {
# code...
}
echo 'For loop: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach (range(0, 100000) as $i) {
# code...
}
echo 'Foreach + range loop: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
出力:
For loop: 0.001291036605835 s
Foreach + range loop: 0.00661301612854 s
[サフィックスとプレフィックスの増分を含むループfor
]
時間差が重要な場合は、前置増分を使用したループの方がfor
後置増分を使用したループよりもfor
高速に実行されることを知っておく必要があります。
これは、サフィックスは 1 つインクリメントする前に前の値のコピーを保持するのに対し、プレフィックス インクリメントは前の値のコピーを保持せずに 1 を追加するためです。
例:
<?php
$time_one = microtime(true);
for ($i=0; $i < 100000; ++$i) {
# code...
}
echo 'For loop with prefix $i: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
for ($i=0; $i < 100000; $i++) {
# code...
}
echo 'For loop with postfix $i: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
出力:
For loop with prefix $i: 0.0012187957763672 s
For loop with postfix $i: 0.0031270980834961 s
[count
関数付きループfor
]
count
関数を含むループは、for
関数を持たないループよりも高速に実行されます。
count
以下のコード ブロックで 2 つのテストを実行しました。最初のテストは関数を使用したループを使用しfor
、2 番目のテストは関数を使用count
せずに配列内の要素の数を使用しました。
例:
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count function: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
for ($i=0; $i < 10; $i++) {
# code...
}
echo 'For loop without count function: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
出力:
For loop with count function: 6.9141387939453E-6 s
For loop without count function: 9.5367431640625E-7 s
【鍵なしforeach
・鍵ありforeach
】
キーを使用しないループは、キーと値を使用するforeach
ループよりも高速に実行されます。foreach
以下のコード スニペットには 10 個の要素の配列があり、foreach
配列に対してループを実行します。最初の実行ではキーが使用されませんが、2 回目の実行ではキーと値が使用されます。
例:
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
foreach ($myArray as $value) {
# code...
}
echo 'Foreach loop without key: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$t01 = microtime(true);
foreach ($myArray as $key => $value) {
# code...
}
echo 'Foreach loop with key and value: ' . (microtime(true) - $t01) . ' s', PHP_EOL;
?>
出力:
Foreach loop without key: 0.00055599212646484 s
Foreach loop with key and value: 9.5367431640625E-7 s
[count
関数for
とキーと値を使用したループforeach
]
(foreach
キーと値を使用した)for
間の 10 個の要素の配列に対して関数を使用してcount
テストし、キーと値を使用した方がforeach
カウント関数を使用した場合よりも優れていることがわかりました。
例:
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach ($myArray as $key => $value) {
# code...
}
echo 'Foreach loop with key and value: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
出力:
For loop with count: 8.1062316894531E-6 s
Foreach loop with key and value: 2.1457672119141E-6 s
[キーありcount
とforeach
キーfor
なしのループ]
count
関数を使用したサイクルfor
とキーを使用しないサイクルforeach
は同じ速度で実行されます。
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach ($myArray as $value) {
# code...
}
echo 'Foreach loop without key: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
出力:
For loop with count: 9.5367431640625E-7 s
Foreach loop without key: 9.5367431640625E-7 s
[count
とfor
範囲を使用したループforeach
]
count を使用したループはfor
、 range を使用したループよりもforeach
高速に実行されます。
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach (range(0, 10) as $i) {
# code...
}
echo 'Foreach loop with range: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
出力:
For loop with count: 1.0013580322266E-5 s
Foreach loop with range: 3.0994415283203E-6 s
Web ブラウザでコード例を実行すると、異なるタイミング結果が得られることに注意してください。上記のコード例はすべて、PHP 8.1.2 を使用して Windows 10 で実行しました。
[for
ループとforeach
ループの可読性 ]
for
読みやすさの点では、ループよりもループの方が読みやすいことがわかりますforeach
。これは、forfor
ループでは、より大きな数よりも小さなカウンタを比較していることがわかるためです。
range で使用する場合は、ループ内で関数の目的を推測するforeach
必要があります。foreach
range