php 高性能書寫
更新時(shí)間:2010年12月11日 22:50:10 作者:
從這里就可以看到,第二段代碼會(huì)因應(yīng)數(shù)組中的鍵的個(gè)數(shù)去不停地作出判斷次數(shù)為1+2+3的判斷,所以變成了第一段代碼判斷次數(shù)是3,而第二段代碼判斷次數(shù)是6次
從.NET轉(zhuǎn)去做PHP4年了,最近開始追求高性能了~~
所以開始覺得是時(shí)候要寫寫博客了~
來段發(fā)現(xiàn)物先~
$arr = array(
'attr1' => 1 ,
'attr2' => 1 ,
'attr3' => 1 ,
);
$startTime = microtime( true );
for( $i = 0 ; $i < 1000 ; $i++ )
{
if( isset( $arr['attr1'] ) )
{
}
if( isset( $arr['attr2'] ) )
{
}
if( isset( $arr['attr3'] ) )
{
}
}
$endTime = microtime( true );
printf( "%d us.\n" , ( $endTime - $startTime ) * 1000000 );
$startTime = microtime( true );
for( $i = 0 ; $i < 1000 ; $i++ )
{
foreach( $arr as $key => $value )
{
switch( $key )
{
case 'attr1':
break;
case 'attr2':
break;
case 'attr3':
break;
}
}
}
$endTime = microtime( true );
printf( "%d us.\n" , ( $endTime - $startTime ) * 1000000 );
上面一段代碼
輸出結(jié)果是
us.
us.
然而,怎么看都是第一段比第二段繁瑣,而且結(jié)構(gòu)沒有第二段清晰,
那么為什么第一段會(huì)比第二段執(zhí)行快了這么多呢
我們可以看到第一段的代碼中,只有3個(gè)if,
那么第二段會(huì)有多少個(gè)呢。
我們拆開了switch這個(gè)東西,可以去看看他的基本實(shí)現(xiàn)原理。
如果switch中,每一段case中都是使用break;結(jié)束的話,
其實(shí)這個(gè)switch好比多個(gè)if{}else if{}
所以從這個(gè)機(jī)制,我們就可以把的
foreach( $arr as $key => $value )
{
switch( $key )
{
case 'attr1':
break;
case 'attr2':
break;
case 'attr3':
break;
}
}
轉(zhuǎn)換成
foreach( $arr as $key => $value )
{
if( $key == 'attr1' )
{
}
else if( $key == 'attr2' )
{
}
else if( $key == 'attr3' )
{
}
}
去理解,
從這里就可以看到,第二段代碼會(huì)因應(yīng)數(shù)組中的鍵的個(gè)數(shù)去不停地作出判斷次數(shù)為1+2+3的判斷,所以變成了第一段代碼判斷次數(shù)是3,而第二段代碼判斷次數(shù)是6次
所以就導(dǎo)致了執(zhí)行效率相差了接近一倍的速度。
所以開始覺得是時(shí)候要寫寫博客了~
來段發(fā)現(xiàn)物先~
復(fù)制代碼 代碼如下:
$arr = array(
'attr1' => 1 ,
'attr2' => 1 ,
'attr3' => 1 ,
);
$startTime = microtime( true );
for( $i = 0 ; $i < 1000 ; $i++ )
{
if( isset( $arr['attr1'] ) )
{
}
if( isset( $arr['attr2'] ) )
{
}
if( isset( $arr['attr3'] ) )
{
}
}
$endTime = microtime( true );
printf( "%d us.\n" , ( $endTime - $startTime ) * 1000000 );
$startTime = microtime( true );
for( $i = 0 ; $i < 1000 ; $i++ )
{
foreach( $arr as $key => $value )
{
switch( $key )
{
case 'attr1':
break;
case 'attr2':
break;
case 'attr3':
break;
}
}
}
$endTime = microtime( true );
printf( "%d us.\n" , ( $endTime - $startTime ) * 1000000 );
上面一段代碼
輸出結(jié)果是
us.
us.
然而,怎么看都是第一段比第二段繁瑣,而且結(jié)構(gòu)沒有第二段清晰,
那么為什么第一段會(huì)比第二段執(zhí)行快了這么多呢
我們可以看到第一段的代碼中,只有3個(gè)if,
那么第二段會(huì)有多少個(gè)呢。
我們拆開了switch這個(gè)東西,可以去看看他的基本實(shí)現(xiàn)原理。
如果switch中,每一段case中都是使用break;結(jié)束的話,
其實(shí)這個(gè)switch好比多個(gè)if{}else if{}
所以從這個(gè)機(jī)制,我們就可以把的
復(fù)制代碼 代碼如下:
foreach( $arr as $key => $value )
{
switch( $key )
{
case 'attr1':
break;
case 'attr2':
break;
case 'attr3':
break;
}
}
轉(zhuǎn)換成
復(fù)制代碼 代碼如下:
foreach( $arr as $key => $value )
{
if( $key == 'attr1' )
{
}
else if( $key == 'attr2' )
{
}
else if( $key == 'attr3' )
{
}
}
去理解,
從這里就可以看到,第二段代碼會(huì)因應(yīng)數(shù)組中的鍵的個(gè)數(shù)去不停地作出判斷次數(shù)為1+2+3的判斷,所以變成了第一段代碼判斷次數(shù)是3,而第二段代碼判斷次數(shù)是6次
所以就導(dǎo)致了執(zhí)行效率相差了接近一倍的速度。
您可能感興趣的文章:
相關(guān)文章
PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之一 重新組織你的函數(shù)
我把我比較喜歡的和比較關(guān)注的地方寫下來和大家分享。上次我寫了篇《php 跟老大的對(duì)話》。還是有很多疑問,這書幫了我不少的忙2012-04-04PHP封裝的mysqli數(shù)據(jù)庫(kù)操作類示例
這篇文章主要介紹了PHP封裝的mysqli數(shù)據(jù)庫(kù)操作類,涉及php針對(duì)mysqli數(shù)據(jù)庫(kù)的連接、增刪改查、分頁、排序等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02PHP實(shí)現(xiàn)二維數(shù)組中的查找算法小結(jié)
這篇文章主要介紹了PHP實(shí)現(xiàn)二維數(shù)組中的查找算法,涉及PHP數(shù)組遍歷、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06PHP截?cái)鄻?biāo)題且兼容utf8和gb2312編碼
PHP截?cái)鄻?biāo)題的方法有很多,但同時(shí)可以兼容utf8和gb2312卻不多了,下面有個(gè)不錯(cuò)的方法,可以參考下,或許對(duì)大家有所幫助2013-09-09深入解析fsockopen與pfsockopen的區(qū)別
本篇文章是對(duì)fsockopen與pfsockopen的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07php5.4傳引用時(shí)報(bào)錯(cuò)問題分析
這篇文章主要介紹了php5.4傳引用時(shí)報(bào)錯(cuò)問題,結(jié)合實(shí)例形式分析了php5.4傳引用時(shí)報(bào)錯(cuò)問題及解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-01-01