php 高性能书写

时间:2022-08-24 20:25:27

从.NET转去做PHP4年了,最近开始追求高性能了~~ 
所以开始觉得是时候要写写博客了~ 
来段发现物先~ 

复制代码代码如下:


$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 ); 


上面一段代码 
输出结果是 
us. 
us. 
然而,怎么看都是第一段比第二段繁琐,而且结构没有第二段清晰, 
那么为什么第一段会比第二段执行快了这么多呢 
我们可以看到第一段的代码中,只有3个if, 
那么第二段会有多少个呢。 
我们拆开了switch这个东西,可以去看看他的基本实现原理。 
如果switch中,每一段case中都是使用break;结束的话, 
其实这个switch好比多个if{}else if{} 

所以从这个机制,我们就可以把的 

复制代码代码如下:


foreach( $arr as $key => $value ) 

switch( $key ) 

case 'attr1': 
break; 
case 'attr2': 
break; 
case 'attr3': 
break; 


转换成 

复制代码代码如下:


foreach( $arr as $key => $value ) 

if( $key == 'attr1' ) 



else if( $key == 'attr2' ) 



else if( $key == 'attr3' ) 





去理解, 
从这里就可以看到,第二段代码会因应数组中的键的个数去不停地作出判断次数为1+2+3的判断,所以变成了第一段代码判断次数是3,而第二段代码判断次数是6次 


所以就导致了执行效率相差了接近一倍的速度。