因為有好幾個項目等著做,又不是很急,再加上目前成型的那些架構多多少少用著總是有點不太如意,所以決定先自己寫一個架構,然後再做項目。既然寫架構,自然要經常做一些執行效率上的測試,今天做了一個static效率的測試。
類的定義如下:
class test{ public static function a(){} public function b(){}}
比較以下幾種情況
- test::a();
- $obj->a();
- $obj->b();
測試代碼:
$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.764906288480911.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懶得改伺服器配置了,結果應該一樣。