ホームページ  >  記事  >  バックエンド開発  >  foreach ループと while ループの違いとパフォーマンスの比較

foreach ループと while ループの違いとパフォーマンスの比較

伊谢尔伦
伊谢尔伦オリジナル
2017-06-23 13:29:025786ブラウズ

phpでは

foreachとwhileループはどちらもループしますが、foreachとwhileループの違いは何でしょうか?foreachとwhileループの違いとパフォーマンスの比較を紹介します。

while ループでは、Perl は入力行を読み取り、それを変数に格納し、ループ本体を実行します。次に、他の入力行を探しに戻ります。

foreach ループでは、入力 operator の行全体がリストのコンテキストで実行されます (foreach はリストの内容を 1 行ずつ処理する必要があるため)。ループは実行を開始する前に、すべての入力を読み取る必要があります。

大容量のファイルを入力する場合、foreachを使用すると多くのメモリを占有します。両者の違いは非常に明らかです。したがって、最善のアプローチは、通常、while ループの省略表現を使用して、一度に 1 行ずつ処理させることです。

特定のステートメントまたは段落を繰り返し実行する場合、C# には現在のタスクに応じて使用できる 4 つの異なるループ ステートメント オプションが用意されています。ステートメント
について。 foreach ステートメント
。 while ステートメント
。 do ステートメント

1. for

for ステートメントは、含まれるステートメントを何回実行する必要があるかが事前にわかっている場合に特に便利です。通常の構文では、条件が true のときに内部ステートメント (およびループ式

) を繰り返し実行できます: for (初期化; 条件; ループ) 内部ステートメント

初期化、条件、ループはすべて選択可能であることに注意してください。条件を省略すると、終了するためにジャンプ ステートメント (break または goto) を必要とする無限ループが作成される可能性があります。

for (;;)
{
   break; // 由于某些原因
}

もう 1 つの重要な点は、複数のカンマ区切りステートメントを

for ループ

の 3 つのパラメーターすべてに同時に追加できることです。たとえば、2 つの変数を初期化し、3 つの条件を指定し、4 つの変数を繰り返すことができます。 2.foreach

Visual Basic 言語に長い間存在していた機能は、For Each ステートメントを使用した列挙のコレクションです。 C# には、foreach ステートメントを通じて列挙を収集するためのコマンドもあります。

foreach (式内の型識別子) 含まれるステートメント

ループ変数は型と識別子によって宣言され、式はコレクションに対応します。ループ変数は、ループが実行されているコレクション要素を表します。

3.while

インクルードされたステートメントを 0 回以上実行したい場合、while ステートメントはまさにあなたが探しているものです:

while (条件) インクルードされたステートメント

条件ステートメント - これはブール式でもあります- 含まれるステートメントが実行される回数を制御します。 Break ステートメントと continue ステートメントを使用すると、while ステートメント内のステートメントの実行を制御できます。これは、for ステートメントとまったく同じように動作します。

4, do

C# で使用できる最後のループ ステートメントは do ステートメントです。最初のループの後にのみ条件が検証されるという点で、while ステートメントと非常によく似ています。

do
{
内含语句
}
while (条件);

do ステートメントは、含まれているステートメントが少なくとも 1 回実行されていることを保証し、条件が true と評価される限り実行され続けることを保証します。 Break ステートメントを使用すると、実行を強制的に do ブロックから抜け出すことができます。このループをスキップしたい場合は、 continue ステートメントを使用します。

パフォーマンスの比較

foreach は (配列をコピーすることによって) 配列のコピーを操作しますが、while は配列の内部インデックスを移動することによって操作します (foreach が最初であるため)。は配列がコピーされ、while は内部ポインタを直接移動します) を実行しますが、結果はまったく逆になります。

ループ内では配列の「読み取り」操作が実行されるため、foreach は while より高速です:

foreach ($array as $value) { 
echo $value; 
} 
while (list($key) = each($array)) { 
echo $array[$key]; 
}

ループ内では配列の「書き込み」操作が実行され、while の方が foreach より高速です:

foreach ($array as $key => $value) { 
echo $array[$key] = $value . '...'; 
} 
while (list($key) = each($array)) { 
$array[$key] = $array[$key] . '...'; 
}

テストしてみましょうfirst 50,000 個の添え字を持つ

1 次元配列

を走査するのにかかる時間:

<?php
/*
  * @ Author: Lilov
  * @ Homepage: www.111cn.net
  * @ E-mail: zhongjiechao@gmail.com
  *
  */
$arr = array();
for($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
function GetRunTime()
{
list($usec,$sec)=exp lode(" ",microtime());
return ((float)$usec+(float)$sec);
}
######################################
$time_start = GetRunTime();
for($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#39;Used time of for:&#39;.round($time_used, 7).&#39;(s)<br><br>&#39;;
unset($str, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
while(list($key, $val) = each($arr)){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#39;Used time of while:&#39;.round($time_used, 7).&#39;(s)<br><br>&#39;;
unset($str, $key, $val, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
foreach($arr as $key => $val){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#39;Used time of foreach:&#39;.round($time_used, 7).&#39;(s)<br><br>&#39;;
######################################
?>
テスト結果:

3 つのテスト結果を平均する:

それぞれ for、while、および foreach に相当する

0.1311650
0.1666853
0.12374 40

テストを繰り返した結果、同じ配列を走査する場合、foreach が最も速く、while が最も遅いことがわかりました。 foreach は while よりも約 20% ~ 30% 高速です。次に、配列の添え字を 500000 と 5000000 に追加しますが、テスト結果は同じです。しかし、原理的な観点から見ると、foreach は (配列をコピーすることによって) 配列のコピーを操作しますが、while は配列の内部インデックスを移動することによって操作します。一般的に、while は foreach よりも高速であると考えられています。 foreach は最初に配列がコピーされ、while は内部ポインタを直接移動します) を実行しますが、結果はまったく逆になります。その理由は、foreach が PHP の内部実装であるのに対し、while は一般的なループ構造であるためです。

以上がforeach ループと while ループの違いとパフォーマンスの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。