国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

PHP循環(huán)函數(shù)foreach與while性能對(duì)比

2024-05-04 23:07:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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é)果剛剛相反,代碼如下:

  1. /** 
  2.  * while跟foreach函數(shù)性能比較 
  3.  * 
  4.  */ 
  5. // foreach 函數(shù) 
  6. foreach ($array as $key => $value) { 
  7.  echo $array[$key] = $value . '...'
  8. //開(kāi)源軟件:Vevb.com 
  9. // while 函數(shù) 
  10. while (list($key) = each($array)) { 
  11.  $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è)試代碼如下:

  1. <?php 
  2. /* 
  3.   * @ Author: Lilov 
  4.   * @ Homepage: www.survivalescaperooms.com 
  5.   * @ E-mail: zhongjiechao@gmail.com 
  6.   * 
  7.   */ 
  8. $arr = array(); 
  9. for($i = 0; $i < 50000; $i++){ 
  10. $arr[] = $i*rand(1000,9999); 
  11. function GetRunTime() 
  12. list($usec,$sec)=explode(" ",microtime()); 
  13. return ((float)$usec+(float)$sec); 
  14. ###################################### 
  15. $time_start = GetRunTime(); 
  16. for($i = 0; $i < count($arr); $i++){ 
  17. $str .= $arr[$i]; 
  18. $time_end = GetRunTime(); 
  19. $time_used = $time_end - $time_start
  20. echo 'Used time of for:'.round($time_used, 7).'(s)<br><br>'
  21. unset($str$time_start$time_end$time_used); 
  22. ###################################### 
  23. $time_start = GetRunTime(); 
  24. while(list($key$val) = each($arr)){ 
  25. $str .= $val
  26. $time_end = GetRunTime(); 
  27. $time_used = $time_end - $time_start
  28. echo 'Used time of while:'.round($time_used, 7).'(s)<br><br>'
  29. unset($str$key$val$time_start$time_end$time_used); 
  30. ###################################### 
  31. $time_start = GetRunTime(); 
  32. foreach($arr as $key => $val){ 
  33. $str .= $val
  34. $time_end = GetRunTime(); 
  35. $time_used = $time_end - $time_start
  36. echo 'Used time of foreach:'.round($time_used, 7).'(s)<br><br>'
  37. ###################################### 
  38. ?> 

測(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還可以遍歷類的屬性.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南川市| 新邵县| 绥棱县| 太仓市| 镇原县| 惠水县| 九龙城区| 江口县| 吉安市| 定日县| 罗甸县| 新沂市| 青铜峡市| 西乌| 溆浦县| 广安市| 旬阳县| 徐闻县| 潼关县| 龙南县| 晋宁县| 临武县| 高州市| 三亚市| 黑山县| 雷州市| 溆浦县| 镇远县| 巴林左旗| 望都县| 休宁县| 偏关县| 勐海县| 雷州市| 固原市| 玉环县| 连山| 镇远县| 隆回县| 苗栗市| 大埔区|