您好,登錄后才能下訂單哦!
1、作為一名phper,for和foreach循環(huán)遍歷幾乎每天都在使用,那么這兩種遍歷方式哪一種效率更高呢?
2、效率高的原因是什么呢?
3、原理分別是什么呢?
首先要解決第一個問題,我們可以通過一個簡單的測試看一下測試結(jié)果,測試代碼如下:
for循環(huán)遍歷方法:
public function getForTime(){ $big_Array = range(0,1000000,1); /* for循環(huán)遍歷數(shù)組示例 */ $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循環(huán)遍歷耗時:'.$for_Time.'<br>'; }
foreach循環(huán)遍歷方法:
public function getForeachTime(){ $big_Array = range(0,1000000,1); /* foreach循環(huán)遍歷數(shù)組示例 */ $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循環(huán)遍歷耗時:'.$foreach_Time; }
時間計算方法:
/** * 時間統(tǒng)計函數(shù) */ private function microtime_float($time = null) { list($usec, $sec) = explode(' ', $time ? $time : microtime()); return ((float)$usec + (float)$sec); }
看一下兩種方式耗時
/* * 輸出結(jié)果:第一種情況:先count在for循環(huán)遍歷耗時:0.028002023696899 秒 * foreach循環(huán)遍歷耗時:0.003000020980835 秒 * 第二種情況:在for循環(huán)條件中做count遍歷耗時:0.095005035400391 秒 * foreach循環(huán)遍歷耗時:0.0040009021759033 秒 * */
從上面的測試中我們可以明顯的得出兩條結(jié)論:
1、for循環(huán)遍歷的效率是低于foreach循環(huán)遍歷 2、for循環(huán)在外部做count和在條件中做count相比較,第一種效率更高
那么第二個問題:效率高的原因是什么呢?在尋找這個答案之前我們先探討第三個問題,我們看一下原理分別是什么。
for 循環(huán):
每次從$i開始,每次循環(huán)都需要判斷$i是否小于count,這占用了很大一部分時間
小于繼續(xù),否則終止循環(huán)
foreach:
foreach 依賴 IEnumerable. 第一次 var a in GetList() 時 調(diào)用 GetEnumerator 返回第一個對象 并 賦給a, 以后每次再執(zhí)行 var a in GetList() 的時候 調(diào)用 MoveNext.直到循環(huán)結(jié)束. 期間GetList()方法只執(zhí)行一次. 從上面是分析我們明顯可以得出結(jié)論:php 的foreach循環(huán)效率是大大高于for循環(huán)。
BUT:事實真的是這樣嗎?有人會說這個例子已經(jīng)很明顯了啊,結(jié)論一目了然,難道還有其他的可能嗎?
我覺得事實沒這么簡單,如果真的是這樣,for循環(huán)存在的意義是什么呢?
既然foreach效率高于for這么多倍,就直接都用foreach不就行了嗎?個人覺得我測試的這個例子有一定的局限性,并不能作為評估兩個循環(huán)方式效率高低的絕對依據(jù)。
不過,對于我們phper來說,正常工作當(dāng)中還是使用foreach循環(huán)遍歷比較好,至于編譯層是如何工作的沒必要涉及太深,如果有興趣可以深度研究一下。
以下是網(wǎng)友回復(fù):
for存在的意義是因為有一些情況是foreach不好實現(xiàn)的,具體的你可以看一看Effective Java的第46條,雖然你是做php的,但基本都是相通的吧!書里面推薦使用foreach模式,但是有以下三種情況不合適: 1. 過濾-如果需要在集合上遍歷且移去選定的元素,就要使用顯式的迭代,并調(diào)用它的remove方法。 2. 轉(zhuǎn)換-如果需要在list或數(shù)組上遍歷且要替換部分或所有的元素值,則需要list的迭代器或數(shù)組的索引去設(shè)置這些值。 3. 平行迭代-如果需要并行的遍歷多個集合,則需要顯式的控制迭代器或索引變量,以便所有的迭代器或索引能協(xié)同推進 然后for和foreach在性能上貌似遍歷不一樣的數(shù)據(jù)會有不一樣的性能差別,比如鏈表或者數(shù)組,這個也是我最近有所疑惑的。
以上就是for和foreach哪個效率更高?為什么?的詳細內(nèi)容,更多請關(guān)注億速云其它相關(guān)文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。