PHP代码执行效率实验(赋值运算)

    忽然有兴趣做些实验来检测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等也行)。其他的赋值运算也是类似。