考虑了一下(3秒钟),发现还是回来这里写技术博客吧~

从.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  );

上面一段代码

输出结果是

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次

 

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

你可能感兴趣的:(考虑了一下(3秒钟),发现还是回来这里写技术博客吧~)