foreach與while都可以遍歷數(shù)組了,但是foreach與while函數(shù)在對(duì)數(shù)組操作時(shí)那一個(gè)會(huì)更有效一些呢,下面我們來(lái)看一些測(cè)試foreach與while性能的例子吧.
foreach是對(duì)數(shù)組副本進(jìn)行操作(通過(guò)拷貝數(shù)組),而while則通過(guò)移動(dòng)數(shù)組內(nèi)部指標(biāo)進(jìn)行操作,一般邏輯下認(rèn)為,while應(yīng)該比f(wàn)oreach快(因?yàn)閒oreach在開(kāi)始執(zhí)行的時(shí)候首先把數(shù)組復(fù)制進(jìn)去,而while直接移動(dòng)內(nèi)部指標(biāo)),但結(jié)果剛剛相反,代碼如下:
- /**
- * while跟foreach函數(shù)性能比較
- *
- */
- // foreach 函數(shù)
- foreach ($array as $key => $value) {
- echo $array[$key] = $value . '...';
- } //開(kāi)源軟件:Vevb.com
- // while 函數(shù)
- while (list($key) = each($array)) {
- $array[$key] = $array[$key] . '...';
- }
在循環(huán)里進(jìn)行的是數(shù)組“讀”操作,則foreach比while快.
在循環(huán)里進(jìn)行的是數(shù)組“寫(xiě)”操作,則while比f(wàn)oreach快.
為了證明一些吹過(guò)的牛B,現(xiàn)在我們就來(lái)測(cè)試吧.
下面先讓我們來(lái)測(cè)試一下共同遍歷一個(gè)有50000個(gè)下標(biāo)的一維數(shù)組所耗的時(shí)間.
測(cè)試平臺(tái):CPU:P-M 725,內(nèi)存:512M,硬盤(pán):40G 5400轉(zhuǎn),OS:Windows XP SP2,WEB:apache 2.0.54 php5.0.4
測(cè)試代碼如下:
- <?php
- /*
- * @ Author: Lilov
- * @ Homepage: www.survivalescaperooms.com
- * @ E-mail: zhongjiechao@gmail.com
- *
- */
- $arr = array();
- for($i = 0; $i < 50000; $i++){
- $arr[] = $i*rand(1000,9999);
- }
- function GetRunTime()
- {
- list($usec,$sec)=explode(" ",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 'Used time of for:'.round($time_used, 7).'(s)<br><br>';
- 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 'Used time of while:'.round($time_used, 7).'(s)<br><br>';
- 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 'Used time of foreach:'.round($time_used, 7).'(s)<br><br>';
- ######################################
- ?>
測(cè)試結(jié)果:
將三次測(cè)試結(jié)果求平均值:分別對(duì)應(yīng)for、while、foreach
0.1311650,0.1666853,0.1237440
經(jīng)過(guò)反復(fù)多次測(cè)試,結(jié)果表明,對(duì)于遍歷同樣一個(gè)數(shù)組,foreach速度最快,最慢的則是while,foreach比while大約快20% ~ 30%左右,隨后再把數(shù)組下標(biāo)增加到500000、5000000測(cè)試結(jié)果也一樣,但從原理上來(lái)看,foreach是對(duì)數(shù)組副本進(jìn)行操作(通過(guò)拷貝數(shù)組),而while則通過(guò)移動(dòng)數(shù)組內(nèi)部指標(biāo)進(jìn)行操作,一般邏輯下認(rèn)為,while應(yīng)該比f(wàn)oreach快(因?yàn)閒oreach在開(kāi)始執(zhí)行的時(shí)候首先把數(shù)組復(fù)制進(jìn)去,而while直接移動(dòng)內(nèi)部指標(biāo)),但結(jié)果剛剛相反,原因應(yīng)該是,foreach是PHP內(nèi)部實(shí)現(xiàn),而while是通用的循環(huán)結(jié)構(gòu).
所以,在通常應(yīng)用中我更喜歡用foreach形式,簡(jiǎn)單,而且效率高,在PHP5下,foreach還可以遍歷類的屬性.
新聞熱點(diǎn)
疑難解答