网络上到处都是关于php switch和if else的各种性能推测,各家都有自己的说法,但是却很少是经过具体测试得出来的。经过各种测试,得出以下结论:
测试代码如下:
$counter=10000000;
$b=5;
echo PHP_EOL.PHP_EOL;
$start = microtime( true );
for( $n = 1; $n <= $counter; $n++ ){
if($b==1){
$d='ok1';
}
elseif($b==2){
$d='ok2';
}
elseif($b==3){
$d='ok3';
}
elseif($b==4){
$d='ok4';
}
else{
$d='ok';
}
}
$end = microtime( true );
$cost_time = $end - $start;
echo "if else : 耗费时间为{$cost_time},".$d."<br />";
echo PHP_EOL.PHP_EOL;
$start = microtime( true );
for( $i = 1; $i <= $counter; $i++ ){
switch($b){
case 1:$d='ok1';break;
case 2:$d='ok2';break;
case 3:$d='ok3';break;
case 4:$d='ok4';break;
default:$d='ok';
}
}
$end = microtime( true );
$cost_time = $end - $start;
echo "switch : 耗费时间为{$cost_time},".$d."<br />";
一、php switch和if else的各种情况下的性能和效率比较。
1、当用来比较的值是数字字符串(如$b=='1'或case '1')时,不管$b是字符串还是int整数,switch和if else效率基本一样,同时两者的效率都很低。
1.1、当$b是int整数(如:1)时,比字符串数字(如:'1')稍快。
1.2、当$b是非数字开头的字符串(如:'k1')时,比数字开头的字符串(如:'1k')快。
1.3、此种情况下,switch语句排在上面的case比下面的case快,default最慢,可以说和if else没有任何区别。
2、当用来比较的值是int整数(如$b==1或case 1)时,分两种情况:
2.1、当$b是字符串时(如:'1'或'k1'或'kk'),switch和if else效率都和上面的1.1情况一样。
2.2、当$b是int整数(如:1)时,switch和if else效率都很快,比2.1的情况快几倍,需要比较的次数越多,快得越多。此时switch语句最快的是default,其他case基本速度一样(如:1和4速度是一样的),if else在$b<3时,速度比switch快。switch语句的default比if else 的第一个比较稍快。
3、当用来比较的值是非数字字符串(如$b=='kk'或case 'kk')时,不管$b是整数还是字符串,switch和if else效率都很快。switch的效率比情况2.2稍慢,最快的是default,其他case基本速度一样。if else在$b<3时,速度比switch快,但越往后速度越慢,当$>4时,效率比switch低一倍以上,比较的次数越多,差得越多(switch此时不管有多少个case,效率都一样,而if else则随比较次数增加而效率降低,越后面的语句越慢)。
二、php if else和三元语句以及AND、&&等语句的性能和效率比较。
1、经测试,if($a==$b){$c='ok';} else {$c='no';}比三元语句$c=$a==$b ?'ok':'no'; 快差不多一倍。
2、经测试if($a==$b){$c='ok';}比AND语句$a==$b AND $c='ok';快40%左右。
3、经测试
if($a==$b){
if($a1==$b1){
$c='ok';
}
else{
$c='no';
}
}
else{
$c='no';
}
//比下面的语句快50%,
if($a==$b && $a1==$b1){
$c='ok';
}
else{
$c='no';
}
4、经测试PHP if语句在各种情况的效率比较如下:
if(true)>if($a=='ok')>if($a)>if(!$a)=if($a===true)>if($a!==true)>AND语句>三元语句。