萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> $i++ ++$i 運行速度與區別

$i++ ++$i 運行速度與區別

關於$i++與++$i是什麼區別了,下面來看看這些區別的分別。

<?php
方式一:

$begin = time();
$i = 0;
while(++$i < 10000)
{
$j = 0;
  while(++$j < 10000)
    ;
  ;
}
$end = time();

時間 : 16s

方式二:

$begin = time();
$i = 0;
while($i < 10000)
{
$j = 0;
  while($j < 10000)
    ++$j;
  ++$i;
}
$end = time();

時間:13s

方式三:

$begin = time();
$i = 0;
while($i < 10000)
{
$j = 0;
  while($j < 10000)
$j++;
  $i++;
}
$end = time();


時間:15s

 

方式四:

$begin = time();
$i = 0;
while($i++ < 10000)
{
$j = 0;
  while($j++ < 10000)
    ;
  ;
}
$end = time();
時間:13s


呵呵, 為什麼會這樣呢?
對比第一種方法和第二種方法, 因為在PHP中, 最終被執行的是OPCODE, 每行opline都有倆個操作數, 對於操作數來說, 一般有3種類型的存取方式, 臨時變量, 變量, 和編譯時變量, 這三種變量其中, 存取最快的是第三種, 編譯器變量, 在OpCode執行過程中, 會講一個變量的加一級引用存儲在一個hash結構中, 用來加快存取速度.
在第一種方法中:
$i = 0;
while(++$i < 10000)
{
$j = 0;
  while(++$j < 10000)
    ;
  ;
}


因為對於++$i來說, 我們需要得到它的返回值, 來和10000做比較, 這樣就會使得PHP在編譯的時候 , 生成一個變量(IS_VAR), 來保存自增的結果 , 也就是說, 這個時候用到了opline的return操作數.
然後, PHP會拿這個變量(IS_VAR)來和10000做比較.
而對於第二種方式:
$i = 0;
while($i < 10000)
{
$j = 0;
  while($j < 10000)
    ++$j;
  ++$i;
}


這個過程中, $i已經優化成了編譯變量(IS_CV), 而對於++$i, 因為我們不需要保存他的返回值, 所以也只是直接對編譯變量進行自增..
也就是說, 方法一和方法二的速度差異, 就在於 對於方式二, 我們一直都在實用編譯變量.. 編譯變量的存取速度遠快於變量(IS_VAR)
再來看第三種和第四種方式:
//3:
$i = 0;
while($i < 10000)
{
$j = 0;
  while($j < 10000)
$j++;
  $i++;
}
//4:
$i = 0;
while($i++ < 10000)
{
$j = 0;
  while($j++ < 10000)
    ;
  ;
}


我們知道後綴自增(POST_INC), 會返回一個對原值的copy, 然後自增.
對於第四種方式, $i++以後, ZE會將$i的原值, 存儲在一個臨時變量(IS_TMP_VAR). 並且會拿這個臨時變量和10000對比.
所以, 嚴格來講, 這部分的速度比起第一種方式來說是會慢一些的.

copyright © 萬盛學電腦網 all rights reserved