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

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

php中foreach和while循環(huán)的區(qū)別比較

2024-05-04 23:07:13
字體:
供稿:網(wǎng)友

foreach和while在php中都循環(huán),那么foreach和while循環(huán)之間他們的區(qū)別是什么,那個(gè)性能會(huì)更好一些,下面我來給大家介紹foreach和while循環(huán)區(qū)別與性能比較,有需要了解的同學(xué)可參考.

在while循環(huán)里,Perl會(huì)讀入一行輸入,把它存入某個(gè)變量并且執(zhí)行循環(huán)主體.然后,它再回頭去找其他的輸入行.

在foreach循環(huán)中,整行輸入操作符會(huì)在列表上下文中執(zhí)行(因?yàn)閒oreach需要逐行處理列表的內(nèi)容).在循環(huán)開始執(zhí)行之前,它必須先將輸入全部讀進(jìn)來.

當(dāng)輸入大容量的文件時(shí),使用foreach會(huì)占用大量的內(nèi)存.兩者的差異會(huì)十分明顯.因此,最好的做法,通常是盡量使用while循環(huán)的簡(jiǎn)寫,讓它每次處理一行.

下面是一些資料:

當(dāng)你想重復(fù)執(zhí)行某些語(yǔ)句或語(yǔ)段時(shí),依據(jù)當(dāng)前不同的任務(wù),C#提供4個(gè)不同的循環(huán)語(yǔ)句選擇給你使用:

.for 語(yǔ)句

.foreach 語(yǔ)句

.while 語(yǔ)句

.do 語(yǔ)句

1.for

當(dāng)你預(yù)先知道一個(gè)內(nèi)含語(yǔ)句應(yīng)要執(zhí)行多少次時(shí),for 語(yǔ)句特別有用.當(dāng)條件為真時(shí),常規(guī)語(yǔ)法允許重復(fù)地執(zhí)行內(nèi)含語(yǔ)句(和循環(huán)表達(dá)式):

for (初始化;條件;循環(huán)) 內(nèi)含語(yǔ)句

請(qǐng)注意,初始化、條件和循環(huán)都是可選的.如果忽略了條件,你就可以產(chǎn)生一個(gè)死循環(huán),要用到跳轉(zhuǎn)語(yǔ)句(break 或goto)才能退出.

實(shí)例代碼如下:

  1. for (;;) 
  2. break// 由于某些原因 

另外一個(gè)重點(diǎn)是,你可以同時(shí)加入多條由逗號(hào)隔開的語(yǔ)句到for循環(huán)的所有三個(gè)參數(shù).例如,你可以初始化兩個(gè)變量、擁有三個(gè)條件語(yǔ)句,并重復(fù)4個(gè)變量.

2.foreach

已經(jīng)在Visual Basic 語(yǔ)言中存在了很久的一個(gè)功能是,通過使用For Each 語(yǔ)句收集枚舉.C#通過foreach 語(yǔ)句,也有一個(gè)用來收集枚舉的命令:

foreach(表達(dá)式中的類型標(biāo)識(shí)符) 內(nèi)含語(yǔ)句

循環(huán)變量由類型和標(biāo)識(shí)符聲明,且表達(dá)式與收集相對(duì)應(yīng).循環(huán)變量代表循環(huán)正在為之運(yùn)行的收集元素.

3.while

當(dāng)你想執(zhí)行一個(gè)內(nèi)含語(yǔ)句0次或更多次時(shí),while語(yǔ)句正是你所盼望的:

while (條件) 內(nèi)含語(yǔ)句

條件語(yǔ)句——它也是一個(gè)布爾表達(dá)式 ——控制內(nèi)含語(yǔ)句被執(zhí)行的次數(shù).你可以使用 break 和continue語(yǔ)句來控制while語(yǔ)句中的執(zhí)行語(yǔ)句,它的運(yùn)行方式同在for語(yǔ)句中的完全相同.

4,do

C#最后可利用的循環(huán)語(yǔ)句是do語(yǔ)句.它與while語(yǔ)句十分相似,僅當(dāng)經(jīng)過最初的循環(huán)之后,條件才被驗(yàn)證.

實(shí)例代碼如下:

  1. do 
  2. 內(nèi)含語(yǔ)句 
  3. while (條件); 

do語(yǔ)句保證內(nèi)含語(yǔ)句至少被執(zhí)行過一次,而且只要條件求值等于真,它們繼續(xù)被執(zhí)行.通過使用break語(yǔ)句,你可以迫使運(yùn)行退出 do 語(yǔ)塊.如果你想跳過這一次循環(huán),使用continue語(yǔ)句.

性能對(duì)比

foreach是對(duì)數(shù)組副本進(jìn)行操作(通過拷貝數(shù)組),而while則通過移動(dòng)數(shù)組內(nèi)部指標(biāo)進(jìn)行操作,一般邏輯下認(rèn)為,while應(yīng)該比f(wàn)oreach快(因?yàn)閒oreach在開始執(zhí)行的時(shí)候首先把數(shù)組復(fù)制進(jìn)去,而while直接移動(dòng)內(nèi)部指標(biāo).),但結(jié)果剛剛相反. 

在循環(huán)里進(jìn)行的是數(shù)組“讀”操作,則foreach比while快:

實(shí)例代碼如下:

  1. foreach ($array as $value) {  
  2. echo $value;  
  3. }  
  4. while (list($key) = each($array)) {  
  5. echo $array[$key];  
  6. 在循環(huán)里進(jìn)行的是數(shù)組“寫”操作,則whileforeach快: 
  7. 實(shí)例代碼如下: 
  8. foreach ($array as $key => $value) {  
  9. echo $array[$key] = $value . '...';  
  10. }  
  11. while (list($key) = each($array)) {  
  12. $array[$key] = $array[$key] . '...';  

下面先讓我們來測(cè)試一下共同遍歷一個(gè)有50000個(gè)下標(biāo)的一維數(shù)組所耗的時(shí)間:

測(cè)試平臺(tái):

CPU:P-M 725

內(nèi)存:512M

硬盤:40G 5400轉(zhuǎn)

OS:Windows xp SP2

WEB:apache 2.0.54  php5.0.4

測(cè)試代碼:

實(shí)例代碼如下:

  1. <?php 
  2. /* 
  3.   * @ Author: Lilov 
  4.   * @ Homepage: www.111cn.net 
  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)=exp lode(" ",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)過反復(fù)多次測(cè)試,結(jié)果表明,對(duì)于遍歷同樣一個(gè)數(shù)組,foreach速度最快,最慢的則是while.foreach比while大約快20% ~ 30%左右.隨后再把數(shù)組下標(biāo)添加到500000、5000000測(cè)試結(jié)果也一樣.但從原理上來看,foreach是對(duì)數(shù)組副本實(shí)行操作(通過拷貝數(shù)組),而while則通過移動(dòng)數(shù)組內(nèi)部指標(biāo)實(shí)行操作,一般邏輯下認(rèn)為,while應(yīng)該比f(wàn)oreach快(因?yàn)閒oreach在開始執(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).

總結(jié):通常認(rèn)為,foreach涉及到值復(fù)制,一定會(huì)比while慢,但實(shí)際上,如果僅僅是在循環(huán)里進(jìn)行數(shù)組的讀操作,那么foreach是很 快的,這是因?yàn)镻HP采用的復(fù)制機(jī)制是“引用計(jì)數(shù),寫時(shí)復(fù)制”,也就是說,即便在PHP里復(fù)制一個(gè)變量,最初的形式從根本上說其實(shí) 仍然是引用的形式,只有當(dāng)變量的內(nèi)容發(fā)生變化時(shí),才會(huì)出現(xiàn)真正的復(fù)制,之所以這么做是出于節(jié)省內(nèi)存消耗得目的,同時(shí)也提升了 復(fù)制的效率.這樣看來,foreach的高效讀操作就不難理解了.另外,既然foreach不適合處理數(shù)組寫操作,那么我們可以得出一個(gè)結(jié) 論,多數(shù)情況下,類似foreach ($array as $key => $value)形式的做數(shù)組寫操作得代碼都應(yīng)該被替換成while (list($key) = each($array)).這些技巧產(chǎn)生的速度差異在小項(xiàng)目里可能并不明顯,但是在類似框架這樣的大項(xiàng)目中,一次請(qǐng)求動(dòng)輒便會(huì)涉及到幾 百幾千幾萬(wàn)次數(shù)組循環(huán)操作,差異就會(huì)明顯放大.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 河间市| 清流县| 乌鲁木齐市| 深圳市| 揭西县| 西乡县| 乌拉特中旗| 桐庐县| 会泽县| 霸州市| 临洮县| 双鸭山市| 长兴县| 威海市| 伊春市| 锡林浩特市| 霞浦县| 林西县| 梓潼县| 嘉荫县| 库伦旗| 福建省| 星子县| 宁南县| 中卫市| 前郭尔| 华坪县| 崇文区| 高安市| 壤塘县| 福鼎市| 赣榆县| 沙雅县| 乐亭县| 合山市| 隆化县| 尤溪县| 阜平县| 西华县| 梅州市| 乌兰察布市|