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

相关文章
相关标签/搜索