PHP類中Static方法效率測(cè)試代碼
更新時(shí)間:2010年10月17日 14:48:10 作者:
因?yàn)橛泻脦讉€(gè)項(xiàng)目等著做,又不是很急,再加上目前成型的那些框架多多少少用著總是有點(diǎn)不太如意,所以決定先自己寫一個(gè)框架,然后再做項(xiàng)目。既然寫框架,自然要經(jīng)常做一些執(zhí)行效率上的測(cè)試,今天做了一個(gè)static效率的測(cè)試。
類的定義如下:
class test
{
public static function a(){}
public function b(){}
}
$obj = new test;
比較以下幾種情況
test::a();
$obj->a();
$obj->b();
測(cè)試代碼:
$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是自定義的計(jì)算平均數(shù)的一個(gè)函數(shù):
function avg($arr)
{
$result = 0;
foreach ($arr as $val)
{
$result += $val;
}
$result /= count($arr);
return $result;
}
程序輸出結(jié)果:
PHP 5.2.14
view sourceprint?1 0.76490628848091
2 1.0699484376399
view sourceprint?1 PHP 5.3
view sourceprint?1 0.56919482299058<BR>1.1016495598611
重復(fù)執(zhí)行N(N>10)次,都與這個(gè)結(jié)果相差不大,說明:
1、直接通過類名訪問靜態(tài)方法的效率是通過實(shí)例訪問靜態(tài)方法的76%,甚至用PHP5.3時(shí)只有56%
2、通過實(shí)例訪問靜態(tài)方法的效率是訪問非靜態(tài)成員方法效率的106,在5.3版本變成110%
3、假設(shè)PHP從5.2升級(jí)到5.3時(shí)通過類名訪問靜態(tài)方法的效率沒有降低,那么通過實(shí)例訪問函數(shù)的效率至少提高了35%。我沒看過PHP源碼,有研究過PHP源碼的朋友希望能告訴我這個(gè)假設(shè)是否成立 (我想應(yīng)該是成立的)
說明:以上測(cè)試基于windows 7和php.exe,5.2.14使用了apache2.2測(cè)試結(jié)果沒有區(qū)別,考慮到php.exe和通過web訪問所執(zhí)行的PHP核心是一樣的,所以5.3懶得改服務(wù)器配置了,結(jié)果應(yīng)該一樣。
復(fù)制代碼 代碼如下:
class test
{
public static function a(){}
public function b(){}
}
$obj = new test;
比較以下幾種情況
test::a();
$obj->a();
$obj->b();
測(cè)試代碼:
復(fù)制代碼 代碼如下:
$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是自定義的計(jì)算平均數(shù)的一個(gè)函數(shù):
復(fù)制代碼 代碼如下:
function avg($arr)
{
$result = 0;
foreach ($arr as $val)
{
$result += $val;
}
$result /= count($arr);
return $result;
}
程序輸出結(jié)果:
復(fù)制代碼 代碼如下:
PHP 5.2.14
view sourceprint?1 0.76490628848091
2 1.0699484376399
view sourceprint?1 PHP 5.3
view sourceprint?1 0.56919482299058<BR>1.1016495598611
重復(fù)執(zhí)行N(N>10)次,都與這個(gè)結(jié)果相差不大,說明:
1、直接通過類名訪問靜態(tài)方法的效率是通過實(shí)例訪問靜態(tài)方法的76%,甚至用PHP5.3時(shí)只有56%
2、通過實(shí)例訪問靜態(tài)方法的效率是訪問非靜態(tài)成員方法效率的106,在5.3版本變成110%
3、假設(shè)PHP從5.2升級(jí)到5.3時(shí)通過類名訪問靜態(tài)方法的效率沒有降低,那么通過實(shí)例訪問函數(shù)的效率至少提高了35%。我沒看過PHP源碼,有研究過PHP源碼的朋友希望能告訴我這個(gè)假設(shè)是否成立 (我想應(yīng)該是成立的)
說明:以上測(cè)試基于windows 7和php.exe,5.2.14使用了apache2.2測(cè)試結(jié)果沒有區(qū)別,考慮到php.exe和通過web訪問所執(zhí)行的PHP核心是一樣的,所以5.3懶得改服務(wù)器配置了,結(jié)果應(yīng)該一樣。
相關(guān)文章
php不用內(nèi)置函數(shù)對(duì)數(shù)組排序的兩個(gè)算法代碼
php不用內(nèi)置函數(shù)對(duì)數(shù)組排序,可能是降序或者升序2010-02-02
php中的單引號(hào)、雙引號(hào)和轉(zhuǎn)義字符詳解
下面小編就為大家?guī)硪黄猵hp中的單引號(hào)、雙引號(hào)和轉(zhuǎn)義字符詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Http 1.1 Etag 與 Last-Modified提高php效率
2008-01-01
PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼
PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-03-03
PHP通過CURL實(shí)現(xiàn)定時(shí)任務(wù)的圖片抓取功能示例
這篇文章主要介紹了PHP通過CURL實(shí)現(xiàn)定時(shí)任務(wù)的圖片抓取功能,涉及php的curl及dom操作相關(guān)技巧,需要的朋友可以參考下2016-10-10
PHP鉤子與簡(jiǎn)單分發(fā)方式實(shí)例分析
這篇文章主要介紹了PHP鉤子與簡(jiǎn)單分發(fā)方式,結(jié)合實(shí)例形式分析了PHP鉤子的定義與使用方法,以及多通道自由切換的實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
Thinkphp結(jié)合ajaxFileUpload實(shí)現(xiàn)異步圖片傳輸示例
這篇文章主要給大家介紹了利用Thinkphp結(jié)合ajaxFileUpload實(shí)現(xiàn)異步圖片傳輸?shù)姆椒?,文中給出了詳細(xì)的示例代碼,對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03

