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遠(yuǎn)程連接oracle數(shù)據(jù)庫操作實(shí)現(xiàn)方法圖文詳解
這篇文章主要介紹了PHP遠(yuǎn)程連接oracle數(shù)據(jù)庫操作實(shí)現(xiàn)方法,結(jié)合圖文形式詳細(xì)分析了php連接Oracle數(shù)據(jù)庫的相關(guān)配置、實(shí)現(xiàn)方法、遇到的問題、解決方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別
這篇文章主要介紹了php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別,詳細(xì)分析了time()與$_SERVER[REQUEST_TIME]的用法,并以實(shí)例形式對(duì)比總結(jié)了二者在獲取當(dāng)前系統(tǒng)時(shí)間戳與請(qǐng)求時(shí)間戳的區(qū)別,需要的朋友可以參考下2014-11-11
PHP中加密解密函數(shù)與DES加密解密實(shí)例
這篇文章主要介紹了PHP中加密解密函數(shù)與DES加密解密,以實(shí)例形式分析了常用的PHP加密解密算法encrypt與DES加密解密的原理及應(yīng)用方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
php以fastCGI的方式運(yùn)行時(shí)文件系統(tǒng)權(quán)限問題及解決方法
在IIS7.0上以FastCGI方式配置好PHP運(yùn)行環(huán)境,測(cè)試可以正常運(yùn)行PHP程序后,將PHP程序部署上去,導(dǎo)入程序原來的數(shù)據(jù)和配置信息。很快就有問題出來啦下面我們就詳細(xì)記錄下。2015-05-05
centos7環(huán)境下swoole1.9的安裝與HttpServer的使用方法分析
這篇文章主要介紹了centos7環(huán)境下swoole1.9的安裝與HttpServer的使用方法,結(jié)合實(shí)例形式分析了centos7環(huán)境下swoole1.9的安裝、配置方法以及HttpServer的相關(guān)使用技巧,需要的朋友可以參考下2020-03-03
php計(jì)數(shù)排序算法的實(shí)現(xiàn)代碼(附四個(gè)實(shí)例代碼)
計(jì)數(shù)排序(Counting sort)是一種根據(jù)小整數(shù)鍵對(duì)一組對(duì)象排序的算法;也就是說,它是一個(gè)整數(shù)排序算法。它通過計(jì)算具有不同鍵值的對(duì)象的數(shù)量,并對(duì)這些數(shù)量使用算術(shù)來確定輸出序列中每個(gè)鍵值的位置2020-03-03

