C和PHP中while和for效率的一點研究

在網上看到不少關於while和for循環效率的討論,有說同樣沒區別的,也有說這個快或者另外一個更快的。php

看了不少也沒有一個比較一致的結論,我的以爲這種東西沒個絕對,for和while都有各自的優缺點,關鍵是咱們要根據狀況的不一樣進行最佳的選擇,固然,肯定哪一個是最佳的不是一件很容易的工做。函數

 

下面我分別使用for和while進行1億次的空循環,並統計消耗的時間。學習

分別在C和PHP兩種語言下進行了測試:測試

先看C語言的代碼:.net

while:code

 
#include<stdio.h>
#include<time.h>
int main()
{
	int i = 1000000000;
	clock_t start,end;
	double spent;
	start = clock();
	while(i--);
	end = clock();
	spent = (double) (end - start) / CLOCKS_PER_SEC;
	printf( "%f seconds\n", spent );
}

for:blog

#include<stdio.h>
#include<time.h>
int main()
{
	int i;
	clock_t start,end;
	double spent;
	start = clock();
	for(i=1000000000;i;i--);
	end = clock();
	spent = (double) (end - start) / CLOCKS_PER_SEC;
	printf( "%f seconds\n", spent );
}

 

執行結果:get

while: 0.300000 秒編譯器

for   : 0.270000 秒io

 

把循環次數改成10億後從新測試,執行結果

while: 2.92 秒

for   : 2.66 秒

 

看來在C中,對於空循環,for和效率明顯要比while高。

 

再來看看PHP代碼:

while:

 

<?php 
$i = 100000000;
$a = explode(" ",microtime());
while($i--);
$b = explode(" ",microtime());
echo ($b[0] + $b[1]) - ($a[0] + $a[1]),"\n";
?>

for:

 

<?php 
$a = explode(" ",microtime());
for($i=100000000;$i;$i--);
$b = explode(" ",microtime());
echo ($b[0] + $b[1]) - ($a[0] + $a[1]),"\n";
?>

執行結果:

while: 2.9293 秒

for   : 3.3837 秒

 

和C語言的測試結果正好相反,在PHP中,這種狀況下while的效率明顯高於for循環。

PHP是由C語言編寫的,相似的代碼,卻有大相徑庭的結果,使人費解。

 

實踐是檢驗真理的惟一標準!

這句話太正確,別人的真理只適合別人,想要找到本身的真理就要動手去實踐!

 

附1:

 

測試環境:

OS:Ubuntu 9.10

CPU: Pentium(R) Dual-Core  CPU      E5400  @ 2.70GHz

Mem: 2G

 

附2:

 

下面是從網上找來的一點資料,關於C中for和while效率的分析,比較底層。

 

初學C語言到如今也有三年的時間了,while 和 for 循環的爭議 一直存在同窗和老師之間,從沒停過 後來學習嵌入式程序,指令週期的概念逐漸變得重要起來,痛定思痛 決定仔細看一下 基於UV4.0的編譯器 對彙編代碼進行了分析 對時間作了一個統計 發現不一樣情況下 差異仍是蠻大的 /*************************************************************************************************************************** 當while 和for 的循環體內 是空語句時: ****************************************************************************************************************************/ i = 10; while(--i); for(i =10 ;i;i--); for(i =10 ;i;--i) 以上三條語句效率相同 對應1條彙編語句 2個機器週期 for(i =0 ;i<10;++i) for(i =0 ;i<10;i++) 以上兩條語句效率相同 對應2條彙編語句 3個機器週期 但while(i--); 效率很低 爲4條語句 6個機器週期 /*************************************************************************************************************************** 當while 和for 的循環體內 不是空語句時: ****************************************************************************************************************************/ for(* ; i ; *) 的效率最高 依然是1條指令 2個機器週期 for(* ; i<10 ; *) 的效率次之 2條指令 3個機器週期 while(i--) 8個機器週期 while(--i) 6個機器週期 while( i++ < * ) 10個機器週期 while( ++ i< * ) 8個機器週期 /**************************************************************************** 推薦使用 for(;i;) *****************************************************************************/ 另外 若是 循環變量 i 是經過函數參數 形式傳遞的值 for()的效率下降到 6-8個機器週期 整體來講: 若是循環變量是參數 且循環體爲空 while(--i); 是最高效的 其餘狀況建議 使用 for(*;i ;*){} while(i--)這個被大多數人看好的語句 不管哪一種狀況下 效率都是最低的;

 

本文來自:苗雨順的CSDN http://blog.csdn.net/rainday0310

相關文章
相關標籤/搜索