因為有好幾個項目等著做,又不是很急,再加上目前成型的那些框架多多少少用著總是有點不太如意,所以決定先自己寫一個框架,然后再做項目。既然寫框架,自然要經常做一些執行效率上的測試,今天做了一個static效率的測試。
類的定義如下:
class test
{public static function a(){}public function b(){}
}
$obj = new test;
?
比較以下幾種情況
- test::a();
- $obj->a();
- $obj->b();
?測試代碼:
php類的屬性和方法、?
$obj = new test;$test_times = 100;
$times = 10000;$effi1 = array();
$effi2 = array();while ($test_times-- > 0)
{$time1 = microtime(true);for($i=0; $i<$times; $i++){test::a();}$time2 = microtime(true);for($i=0; $i<$times; $i++){$obj->a();}$time3 = microtime(true);for($i=0; $i<$times; $i++){$obj->b();}$time4 = microtime(true);$effi1[] = ($time3 - $time2) / ($time2 - $time1);$effi2[] = ($time4 - $time3) / ($time3 - $time2);
}echo avg($effi1),"\n",avg($effi2);
?
最后的avg是自定義的計算平均數的一個函數:
?
function avg($arr)
{$result = 0;foreach ($arr as $val){$result += $val;}$result /= count($arr);return $result;
}
?
程序輸出結果:
PHP 5.2.14
0.76490628848091
1.0699484376399
PHP 5.3
0.56919482299058
1.1016495598611
為了提高測試效率應該怎么做,?
重復執行N(N>10)次,都與這個結果相差不大,說明:
- 直接通過類名訪問靜態方法的效率是通過實例訪問靜態方法的76%,甚至用PHP5.3時只有56%
- 通過實例訪問靜態方法的效率是訪問非靜態成員方法效率的106,在5.3版本變成110%
- 假設PHP從5.2升級到5.3時通過類名訪問靜態方法的效率沒有降低,那么通過實例訪問函數的效率至少提高了35%。我沒看過PHP源碼,有研究過PHP源碼的朋友希望能告訴我這個假設是否成立 (我想應該是成立的)
說明:以上測試基于windows 7和php.exe,5.2.14使用了apache2.2測試結果沒有區別,考慮到php.exe和通過web訪問所執行的PHP核心是一樣的,所以5.3懶得改服務器配置了,結果應該一樣。