php 高性能书写

  从.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次

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