考虑了一下(3秒钟),发现还是回来这里写技术博客吧~
时间:2010-12-09 来源:Luckyboys
所以开始觉得是时候要写写博客了~
来段发现物先~
代码 $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 );
上面一段代码
输出结果是
34044 us. 55035 us.然而,怎么看都是第一段比第二段繁琐,而且结构没有第二段清晰,
那么为什么第一段会比第二段执行快了这么多呢
我们可以看到第一段的代码中,只有3个if,
那么第二段会有多少个呢。
我们拆开了switch这个东西,可以去看看他的基本实现原理。
如果switch中,每一段case中都是使用break;结束的话,
其实这个switch好比多个if{}else if{}
所以从这个机制,我们就可以把的
1 foreach( $arr as $key => $value )2 {
3 switch( $key )
4 {
5 case 'attr1':
6 break;
7
8 case 'attr2':
9 break;
10
11 case 'attr3':
12 break;
13 }
14 }
转换成
1 foreach( $arr as $key => $value )2 {
3 if( $key == 'attr1' )
4 {
5 ;
6 }
7 else if( $key == 'attr2' )
8 {
9 ;
10 }
11 else if( $key == 'attr3' )
12 {
13 ;
14 }
15 }
去理解,
从这里就可以看到,第二段代码会因应数组中的键的个数去不停地作出判断次数为1+2+3的判断,所以变成了第一段代码判断次数是3,而第二段代码判断次数是6次
所以就导致了执行效率相差了接近一倍的速度。
相关阅读 更多 +