この記事を書いた主な理由は、開発中に突然次のような疑問が生じたので、PHP についての理解を深めようと時間をかけて詳しく調べてみました。
1. PHPer として、for および foreach ループの走査はほぼ毎日使用されますが、これら 2 つの走査方法のどちらがより効率的でしょうか?
2. 高効率の理由は何ですか?
3.原則は何ですか?
まず、最初の問題を解決する必要があります。簡単なテストを通じてテスト結果を見てみましょう。テスト コードは次のとおりです:
for ループ走査方法:
public function getForTime(){ $big_Array = range(0,1000000,1); /* for循环遍历数组示例 */ $start_For_Time = $this->microtime_float(); //$array_Count = count($big_Array); for ($i=0;$i<count($big_Array);$i++) { $i; } $end_For_Time = $this->microtime_float(); $for_Time = $end_For_Time - $start_For_Time; echo 'for循环遍历耗时:'.$for_Time.'<br>'; }
foreach ループの走査方法:
public function getForeachTime(){ $big_Array = range(0,1000000,1); /* foreach循环遍历数组示例 */ $start_Foreach_Time = $this->microtime_float(); foreach ($big_Array as $key=>$val) { $key; } $end_Foreach_Time = $this->microtime_float(); $foreach_Time = $end_Foreach_Time - $start_Foreach_Time; echo 'foreach循环遍历耗时:'.$foreach_Time; }
時間計算方法:
/** * 时间统计函数 */ private function microtime_float($time = null) { list($usec, $sec) = explode(' ', $time ? $time : microtime()); return ((float)$usec + (float)$sec); }
2 つの時間の消費を見てください。メソッド
/* * 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒 * foreach循环遍历耗时:0.003000020980835 秒 * 第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒 * foreach循环遍历耗时:0.0040009021759033 秒 * */
上記のことから、テストから 2 つの結論を明確に引き出すことができます:
1、for循环遍历的效率是低于foreach循环遍历 2、for循环在外部做count和在条件中做count相比较,第一种效率更高
次に 2 番目の質問: 効率が高い理由は何ですか?この答えを探す前に、まず 3 番目の質問について説明し、その原則が何であるかを見てみましょう。
for ループ:
$i から開始するたびに、各ループは $i が count より小さいかどうかを判断する必要があり、これには多くの時間がかかります
続行未満、そうでない場合はループを終了
foreach:
foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束. 期间GetList()方法只执行一次. 从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。
しかし: これは本当にそうなのでしょうか?この例はすでに非常に明白であり、結論は一目瞭然であると言う人もいるでしょうが、他の可能性はありますか?
真実はそれほど単純ではないと思いますが、これが本当に事実である場合、for ループの意味は何でしょうか?
foreach は for よりも何倍も効率的であるため、foreach を使用するだけで十分ではないでしょうか。個人的には、私がテストした例には一定の制限があり、2 つのループ法の効率を評価するための絶対的な基礎として使用することはできないと感じています。
ただし、PHPer にとっては、通常の作業では foreach ループ トラバーサルを使用する方が良いでしょう。コンパイル層がどのように機能するかについては、あまり深く調べる必要はありません。興味があれば、次のことを行うことができます。それを深く研究してください。
次はネチズンからの返信です:
for の意味は、foreach の実装が難しい状況があるため存在します。具体的な詳細については、以下をご覧ください。 『Effective Java』第 46 条. PHP をやっているとはいえ、基本的には同じです。この本では foreach モードの使用を推奨していますが、それが不適切な状況が 3 つあります。 1. フィルタリング - コレクションを走査して選択した要素を削除する必要がある場合は、明示的な反復を使用してその delete メソッドを呼び出す必要があります。 2. 変換 - リストまたは配列を反復処理して要素値の一部またはすべてを置き換える必要がある場合、これらの値を設定するにはリストの反復子または配列のインデックスが必要になります。 3. 並列反復 - 複数のコレクションを並行して走査する必要がある場合は、すべてのイテレータまたはインデックスが一緒に進むことができるように、明示的にイテレータまたはインデックス変数を制御する必要があります。その後、for と foreach はパフォーマンスの観点から異なるデータを走査するように見えます。リンクリストや配列など、性能の違いが違うのですが、これが最近気になっていることがあります。
関連する推奨事項: 「PHP チュートリアル 」
以上がfor と foreach ではどちらが効率的ですか?なぜ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。