首頁 >後端開發 >php教程 >for和foreach哪個效率比較高?為什麼?

for和foreach哪個效率比較高?為什麼?

藏色散人
藏色散人轉載
2020-06-13 14:57:385696瀏覽

寫這篇文章的原因主要是在開發過程中突然有以下幾個疑問,特抽出時間深度探究一下,以加深自身對php的理解。

1、身為phper,for和foreach循環遍歷幾乎每天都在使用,那麼這兩種遍歷方式哪一種效率更高呢?

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 &#39;for循环遍历耗时:&#39;.$for_Time.&#39;<br>&#39;;
}

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 &#39;foreach循环遍历耗时:&#39;.$foreach_Time;
}

時間計算方法:

/**
 *  时间统计函数
 */
private function microtime_float($time = null)
{
   list($usec, $sec) = explode(&#39; &#39;, $time ? $time : microtime());
   return ((float)$usec + (float)$sec);
}

看一下兩種方式耗時

/*
 * 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒
 *                         foreach循环遍历耗时:0.003000020980835 秒
 *        第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒
 *                            foreach循环遍历耗时:0.0040009021759033 秒
 * */

從上面的測驗中我們可以明顯的得出兩個結論:

1、for循环遍历的效率是低于foreach循环遍历
2、for循环在外部做count和在条件中做count相比较,第一种效率更高

那麼第二個問題:效率高的原因是什麼呢?在尋找這個答案之前我們先探討第三個問題,我們來看看原理分別是什麼。

for 迴圈:

每次從$i開始,每次迴圈都需要判斷$i是否小於count,這佔用了很大一部分時間

小於繼續,否則終止迴圈

foreach:

foreach 依赖 IEnumerable.
第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,
以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.
从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。

BUT:事實真的是這樣嗎?有人會說這個例子已經很明顯了啊,結論一目了然,難道還有其他的可能嗎?

我覺得事實沒這麼簡單,如果真的是這樣,for迴圈存在的意義是什麼呢?

既然foreach效率高於for這麼多倍,就直接都用foreach不就行了嗎?個人覺得我測試的這個例子有一定的局限性,並不能作為評估兩個循環方式效率高低的絕對依據。

不過,對於我們phper來說,正常工作當中還是使用foreach循環遍歷比較好,至於編譯層是如何工作的沒必要涉及太深,如果有興趣可以深度研究一下。

以下是網友回覆:

for存在的意義是因為有一些情況是foreach不好實現的,具體的你可以看一看Effective Java的第46條,雖然你是做php的,但基本上都是相通的吧!書裡面推薦使用foreach模式,但是有以下三種情況不合適: 1. 過濾-如果需要在集合上遍歷且移去選定的元素,就要使用顯式的迭代,並調用它的remove方法。 2. 轉換-如果需要在list或陣列上遍歷且要取代部分或所有的元素值,則需要list的迭代器或陣列的索引去設定這些值。 3. 平行迭代-如果需要並行的遍歷多個集合,則需要顯式的控制迭代器或索引變量,以便所有的迭代器或索引能協同推進然後for和foreach在性能上貌似遍歷不一樣的數據會有不一樣的效能差別,像是鍊錶或數組,這個也是我最近有所疑惑的。

相關推薦:《

PHP教學

以上是for和foreach哪個效率比較高?為什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除