これらのうちどれがパフォーマンスと読みやすさの点で優れていますか?
foreach(range(0,10000) as $i) {} // 3.847 ms
for($i = 0; $i < 10000; ++$i) {} // 0.663 ms
編集:ベンチマークを実行し、最後のベンチマークはほぼ6倍高速でした。
従来のfor
ループはforeach
+ range
より高速です。最初のものは整数比較と増加のみを使用していますが、最後のものは(おそらく大きな)配列を作成し、内部配列カーソルを移動して各要素を抽出し、最後に到達したかどうかを確認する必要があります。
これを実行すると、プレーンなfor
がforeach
+ range
より2倍高速であることがわかります。
$t0 = microtime(true);
for ($i = 0; $i < 100000; $i++) {
}
echo 'for loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL;
$t0 = microtime(true);
foreach (range(0, 100000) as $i) {
}
echo 'foreach + range loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL;
特定の回数繰り返す必要がある場合は、習慣として従来のfor
を使用することをお勧めしますが、1日の終わりにはほとんどのシナリオで大きなパフォーマンスの改善は見られません(考慮に入れてください)上記の例では、100k回反復します。反復回数を減らすと、差は小さくなります)。
それが重要な場合、
for($i = 0; $i < 1000; ++$i) {}
より速い
for($i = 0; $i < 1000; $i++) {}
しかし、1000回の反復でそれほど大きな違いに気付くことはありません。
マイクロ最適化が本当に必要不可欠なのでしょうか。もしそうなら、さまざまなオプションを自分で比較するためのテスト実行を簡単に設定できないのはなぜですか。
この特定の場合(別のスコープから渡された配列ではなくrange()
を使用)-foreach()
の方が高速です。 for()
は、他のほとんどの場合にそれを上回ります。
Foreachは、キーと値を使用する配列を反復処理するのに最適です。 forループを使用すると、キーの使用を保持することがより困難になります。 http://www.c-sharpcorner.com/interviews/answer/2147/ これは役立つかもしれません
Foreach
は、キーと値を使用する配列を反復するのに最適です。
たとえば、「User」という配列がある場合:
_$User = array(
'name' => 'Bob',
'email' => '[email protected]',
'age' => 200
);
_
私はそれを非常に簡単に繰り返すことができ、それでもキーを利用できます:
_foreach ($User as $key => $value) {
echo $key.' is '.$value.'<br />';
}
_
これは出力します:
_name is Bob
email is [email protected]
age is 200
_
for
ループを使用すると、キーの使用を保持することがより困難になります。
PHPでオブジェクト指向のプラクティスを使用している場合、foreach
ループはほとんど完全に使用されており、for
ループは数値またはリストベースのものにのみ使用されます。 foreach
を使用すると、count($array)
を使用して配列の要素の総数を見つける必要がなくなります。
一部のphp関数の実行速度の比較
forループ
for()
ループusing count()
には20.86401ミリ秒かかりました
for()
ループNot using count()
には7.09796ミリ秒かかりました
count()を使用すると、次のことを意味します:for ($i = 1; $i < count($myarr); ++ $i) {
..
foreach()ループ:
foreach()
には11.16920ミリ秒かかりました
KEYを使用したforeach()
には12.35318ミリ秒かかりました
これらは両方とも同じ配列で行われ、それぞれの実行時間はfor
とforeach
の両方が言語構成要素であることが示され、それらの実行速度はより高速になるため、使用しない限り、これ以上の違いに気付くことはありません。数千のレコードを持つ配列。