ここからわかるように、2番目のコードは配列内のキーの数に応じて1 2 3の判定を連続して行うため、1番目のコードの判定回数は3回となり、 2番目のコードの判定回数は3回 コードセグメント判定回数は6回です
私は.NETからPHPに乗り換えて4年、最近高性能を追求し始めました〜〜
それで思い始めましたブログを書く時間です~
まずは物事を発見するためにドゥアンに来てください~
php
$arr = array(
attr1 => 1 ,
attr2 => 1 ,
attr3 => 1 ,
);
$startTime = microtime( true );
for( $i = 0 ; $i {
if( isset( $arr[attr1] ) )
{
}
if( isset( $ arr[attr2] ) )
{
}
if( isset( $arr[attr3 ] ) )
{
}
}
$endTime = microtime( true );
printf( "%d us.
" , ( $endTime - $startTime ) * 1000000 );
$startTime = microtime( true );
for( $i = 0 ; $i {
foreach( $arr as $key = > $value )
{
switch( $key )
{
case attr1:
break;
case attr2:
break;
case attr3:
break;
}
}
}
$endTime = microtime( true ) ;
printf( "%d 人。
" , ( $endTime - $startTime ) * 1000000 );
?>
上記のコードの出力結果は
us.
us.
しかし、どう見ても最初の段落のほうが面倒です。 2 番目の段落は構造が異なります。 2 番目の段落は明確です。
では、なぜ最初の段落は 2 番目の段落よりもはるかに高速に実行されるのでしょうか。
コードの最初の段落には if が 3 つしかないことがわかります。
どのようにして2 番目の段落には多くの if がありますか?
スイッチを逆アセンブルし、その基本的な実装原理を見てみましょう
スイッチ内の各ケースが Break; で終わる場合、
実際、このスイッチは複数のようなものです。 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 )
{
}
}
?>
理解するにはここから ご覧のとおり、2番目のコードは配列のキーの数に応じて判定回数が1 2 3で連続的に判定を行うので、1番目のコードの判定回数はは 3 で、2 番目のコードの判定数は 6 です