忽然有兴趣做些实验来检测PHP代码的执行效率,这里不打算探讨算法上的优化,只是想比较一下能获得同样执行结果的代码哪个更快。这里就先比较不同的赋值方法吧,这个操作在代码中大量出现,如果出现在循环中,其执行效率就更值得探讨了。
为了方便实验,我编了两个函数,用来记录中间一段代码所耗的时间:
<? function begin(&$start) {
$tmp = gettimeofday();
$start = $tmp[usec]; }
function report($start) {
$tmp = gettimeofday();
$now = $tmp[usec]; echo "耗时: ";
echo $now - $start; echo "<br>";
} ?>
begin()函数是开始计时,把当前的时间记录在$start变量中,report()函数是把当前时间和开始计时时间比较,输出耗时(单位是百万份之一秒,当然我实验的循环数目不多,耗时不会超过一秒的),下面开始实验:
变量递增,用得非常多,大家都知道它有以下几种写法:
$cmp += 1; $cmp = $cmp + 1;
$cmp ++; 它们的执行效率是一样的吗?我们用实验来检测一下: <? begin($start); $cmp = 1; for($i = 0; $i <200; $i ++)
$cmp += 1; report($start);
begin($start);
$cmp = 1; for($i = 0; $i <200; $i ++)
$cmp ++;
report($start);
begin($start); $cmp = 1; for($i = 0; $i <200; $i ++)
$cmp = $cmp + 1; report($start);
?> 输出的结果是
耗时: 3688 耗时: 2992 耗时: 4094
虽然输出结果会波动,但多次实验表明,几种方式的效率排序是几乎不变的。可以看出,$cmp ++这种写法执行效率是最高的,$cmp += 1比较慢,但通常也比$cmp = $cmp + 1还要快些
把+换成-,再做一次实验,会发现$cmp --的情况也是类似的。几种赋值运算执行效率排序为:
($cmp ++) > ($cmp += 1) > ($cmp = $cmp + 1)
($cmp --) > ($cmp -= 1) > ($cmp = $cmp - 1)
($cmp *= 2) > ($cmp = $cmp * 2)
($cmp /= 2) > ($cmp = $cmp / 2)
但是,有没有特殊情况呢?经过试验,发现是有。 <? begin($start); $cmp = 1; for($i = 0; $i <100; $i ++)
$cmp *= 2; report($start);
begin($start);
$cmp = 1; for($i = 0; $i <100; $i ++)
$cmp = $cmp + $cmp; report($start);
begin($start); $cmp = 1; for($i = 0; $i <100; $i ++)
$cmp += $cmp; report($start);
begin($start);
$cmp = 1; for($i = 0; $i <100; $i ++)
$cmp += $cmp + 0; report($start);
begin($start);
$cmp = 1; for($i = 0; $i <100; $i ++)
$cmp += $cmp - 0; report($start);
begin($start);
$cmp = 1; for($i = 0; $i <100; $i ++)
$cmp += $cmp * 1; report($start);
begin($start);
$cmp = 1; for($i = 0; $i <100; $i ++)
$cmp += $cmp / 1; report($start);
?> 输出结果为: 耗时: 2312
耗时: 2474 耗时: 4414 耗时: 2276
耗时: 2377 耗时: 2453 耗时: 2777
会发现$cmp += $cmp这种写法的执行效率是最慢的,而且非常明显。最有意思的是最后的四个输出结果,它们的执行速度明显比$cmp += $cmp要快,但是它们都是在前者的基础上增加一步运算得到的,比如$cmp += $cmp + 0,按理说前者至少不会比它们慢,可是事实就是这样。我想不出理由,因为我不知道PHP内部是如何解释这行代码的。
不过,这个发现至少可以让我们别写像$cmp += $cmp这样的代码。
也是很类似的:
$cmp = $cmp * $cmp比$cmp *= $cmp快;
$cmp = $cmp / $cmp比$cmp /= $cmp快;
$cmp = $cmp - $cmp比$cmp -= $cmp快。
总结:以加法赋值为例子,如果是每次递增1的话,用$cmp ++的形式写最好;如果不是递增1,则用$cmp += 2的形式;特殊的情况:递增的值正好是变量的本身,此时就不要用$cmp += $cmp的形式(可以用$cmp = $cmp + $cmp,或者哪怕用$cmp += $cmp + 0等也行)。其他的赋值运算也是类似。
|
|