<?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對比.
所以, 嚴格來講, 這部分的速度比起第一種方式來說是會慢一些的.