web-dev-qa-db-ja.com

PHP forループvs範囲付き​​foreach

これらのうちどれがパフォーマンスと読みやすさの点で優れていますか?

foreach(range(0,10000) as $i) {} // 3.847 ms

for($i = 0; $i < 10000; ++$i) {} // 0.663 ms

編集:ベンチマークを実行し、最後のベンチマークはほぼ6倍高速でした。

17
Emil Aspman

従来のforループはforeach + rangeより高速です。最初のものは整数比較と増加のみを使用していますが、最後のものは(おそらく大きな)配列を作成し、内部配列カーソルを移動して各要素を抽出し、最後に到達したかどうかを確認する必要があります。

これを実行すると、プレーンなforforeach + 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回反復します。反復回数を減らすと、差は小さくなります)。

14
Carlos

それが重要な場合、

for($i = 0; $i < 1000; ++$i) {}

より速い

for($i = 0; $i < 1000; $i++) {}

しかし、1000回の反復でそれほど大きな違いに気付くことはありません。

マイクロ最適化が本当に必要不可欠なのでしょうか。もしそうなら、さまざまなオプションを自分で比較するためのテスト実行を簡単に設定できないのはなぜですか。

6
Mark Baker

この特定の場合(別のスコープから渡された配列ではなくrange()を使用)-foreach()の方が高速です。 for()は、他のほとんどの場合にそれを上回ります。

0
Narf

Foreachは、キーと値を使用する配列を反復処理するのに最適です。 forループを使用すると、キーの使用を保持することがより困難になります。 http://www.c-sharpcorner.com/interviews/answer/2147/ これは役立つかもしれません

0
rOcKiNg RhO

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)を使用して配列の要素の総数を見つける必要がなくなります。

0
echo_Me

一部の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ミリ秒かかりました

これらは両方とも同じ配列で行われ、それぞれの実行時間はforforeachの両方が言語構成要素であることが示され、それらの実行速度はより高速になるため、使用しない限り、これ以上の違いに気付くことはありません。数千のレコードを持つ配列。