中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php中的for和foreach循環哪個更好i

發布時間:2020-06-15 14:39:33 來源:億速云 閱讀:179 作者:鴿子 欄目:編程語言

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 '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);
}

看一下兩種方式耗時

/*
 * 輸出結果:第一種情況:先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在性能上貌似遍歷不一樣的數據會有不一樣的性能差別,比如鏈表或者數組,這個也是我最近有所疑惑的。

以上就是for和foreach哪個效率更高?為什么?的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邻水| 宾川县| 城步| 精河县| 南雄市| 安多县| 错那县| 永川市| 建德市| 曲麻莱县| 桃园市| 谷城县| 墨玉县| 开封县| 建水县| 左权县| 孟州市| 垫江县| 牟定县| 改则县| 英吉沙县| 涿鹿县| 和龙市| 会昌县| 漯河市| 临海市| 西盟| 遵义市| 长汀县| 伊春市| 奇台县| 即墨市| 安新县| 海阳市| 石景山区| 思南县| 安达市| 吉首市| 平乡县| 通许县| 西盟|