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í)例代碼如下:
- for (;;)
- {
- 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
實(shí)例代碼如下:
- do
- {
- 內(nèi)含語(yǔ)句
- }
- 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í)例代碼如下:
- foreach ($array as $value) {
- echo $value;
- }
- while (list($key) = each($array)) {
- echo $array[$key];
- }
- 在循環(huán)里進(jìn)行的是數(shù)組“寫”操作,則while比foreach快:
- 實(shí)例代碼如下:
- foreach ($array as $key => $value) {
- echo $array[$key] = $value . '...';
- }
- while (list($key) = each($array)) {
- $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í)例代碼如下:
- <?php
- /*
- * @ Author: Lilov
- * @ Homepage: www.111cn.net
- * @ E-mail: zhongjiechao@gmail.com
- *
- */
- $arr = array();
- for($i = 0; $i < 50000; $i++){
- $arr[] = $i*rand(1000,9999);
- }
- function GetRunTime()
- {
- list($usec,$sec)=exp lode(" ",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)過反復(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ì)明顯放大.
新聞熱點(diǎn)
疑難解答