Php 在这种情况下会发生什么?
使用开关:Php 在这种情况下会发生什么?,php,Php,使用开关: switch($page){ case 'dog': case 'cat': case 'robot': case 'default':{ break; }; default:{ break; } } 使用if: if($page == 'dog' || $page == 'cat' || $page == 'robot' || $page == 'default'){ }else{ }
switch($page){
case 'dog':
case 'cat':
case 'robot':
case 'default':{
break;
};
default:{
break;
}
}
使用if:
if($page == 'dog' || $page == 'cat' || $page == 'robot' || $page == 'default'){
}else{
}
使用针头和干草堆:
$pages = array('dog', 'cat', 'robot', 'default');
if(in_array($page, $pages)){
}else{
}
我想知道引擎盖下发生了什么
平均速度:
- 指针执行时间:0.05487704270386秒
- 如果执行时间:0.0144959335327秒
- 开关执行时间:0.0093550682067871秒
number of ops: 31
compiled vars: !0 = $page
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > EXT_STMT
1 ASSIGN !0, 'default'
3 2 NOP
4 3 EXT_STMT
4 CASE ~1 !0, 'dog'
5 > JMPZ ~1, ->7
5 6 > > JMP ->10
7 > EXT_STMT
8 CASE ~1 !0, 'cat'
9 > JMPZ ~1, ->11
6 10 > > JMP ->14
11 > EXT_STMT
12 CASE ~1 !0, 'robot'
13 > JMPZ ~1, ->15
7 14 > > JMP ->18
15 > EXT_STMT
16 CASE ~1 !0, 'default'
17 > JMPZ ~1, ->23
18 > NOP
9 19 EXT_STMT
20 > BRK 1, ->30
11 21* EXT_STMT
22* JMP ->25
23 > EXT_STMT
24 > JMP ->29
25 > NOP
13 26 EXT_STMT
27 > BRK 1, ->30
15 28* JMP ->30
29 > > JMP ->25
16 30 > > RETURN 1
如果
number of ops: 16
compiled vars: !0 = $page
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > EXT_STMT
1 ASSIGN !0, 'default'
3 2 EXT_STMT
3 IS_EQUAL ~1 !0, 'dog'
4 > JMPNZ_EX ~1 ~1, ->7
5 > IS_EQUAL ~2 !0, 'cat'
6 BOOL ~1 ~2
7 > > JMPNZ_EX ~1 ~1, ->10
8 > IS_EQUAL ~3 !0, 'robot'
9 BOOL ~1 ~3
10 > > JMPNZ_EX ~1 ~1, ->13
11 > IS_EQUAL ~4 !0, 'default'
12 BOOL ~1 ~4
13 > > JMPZ ~1, ->15
5 14 > > JMP ->15
针筒和干草堆
number of ops: 17
compiled vars: !0 = $page, !1 = $pages
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > EXT_STMT
1 ASSIGN !0, 'default'
3 2 EXT_STMT
3 INIT_ARRAY ~1 'dog'
4 ADD_ARRAY_ELEMENT ~1 'cat'
5 ADD_ARRAY_ELEMENT ~1 'robot'
6 ADD_ARRAY_ELEMENT ~1 'default'
7 ASSIGN !1, ~1
4 8 EXT_STMT
9 EXT_FCALL_BEGIN
10 SEND_VAR !0
11 SEND_VAR !1
12 DO_FCALL 2 $3 'in_array'
13 EXT_FCALL_END
14 > JMPZ $3, ->16
6 15 > > JMP ->16
9 16 > > RETURN 1
正如您所看到的,交换机实际上具有最多的操作,但在您的测试用例中是最快的(我想您会感兴趣地看到它,因为我认为这些方法中的每一种都可以在特定情况下是“最好的”)
虽然老年退休金计划不是一项标准工作量,但它们确实给出了一个指示
一点比较
开关使用大量的大小写
(检查两个值是否相等)和JMPZ
(地址为零时跳转)
If语句使用IS_EQUAL
,这与case类似,但第二个值必须是常量。我认为这会减慢检查速度,因为现在有2个变量可以检查。(您的基准测试结果似乎与此一致)
下一步使用函数调用。在PHP中,函数通常被认为是慢的
是函数的C源代码,每种类型的变量具有不同的逻辑。假设我们使用的是字符串,数组将循环并使用
如果可能的话,早点回来
基准脚本
$max_checks = 1000000;
$bench = -microtime(true);
for($i = 0;$i < $max_checks; $i++) {
switch($page){
case 'dog':
case 'cat':
case 'robot':
case 'default':{
break;
};
default:{
break;
}
}
}
echo "\nSwitch took " . (microtime(true) + $bench);
$bench = -microtime(true);
for($i = 0;$i < $max_checks; $i++) {
$page == 'dog' || $page == 'cat' || $page == 'robot' || $page == 'default';
}
echo "\nif took " . (microtime(true) + $bench);
$pages = array('dog', 'cat', 'robot', 'default');
$bench = -microtime(true);
for($i = 0;$i < $max_checks; $i++) {
(in_array($page, $pages));
}
echo "\nneedle haystack took " . (microtime(true) + $bench);
传入$page='default'代码>
Switch took 0.46866297721863
if took 0.40072298049927
needle haystack took 1.6747360229492
Switch took 0.040921211242676
if took 0.085216999053955
if(===) took 0.1043848991394
needle haystack took 0.052649974822998
传入$page='不匹配'代码>
Switch took 0.52629804611206
if took 0.40276217460632
needle haystack took 1.6838929653168
Switch took 0.059795141220093
if took 0.080615997314453
if(===) took 0.10486197471619
needle haystack took 0.049200057983398
我不确定你使用了什么输入,但如果和开关对我来说是相似的(边缘对开关更具可读性)
编辑:
1个更快的测试用例。
将if与===
这将用IS\u idential
调用替换IS\u idential
有一点加速
对于所有测试用例
if took 0.43217587471008
if(===) took 0.39284706115723
操作码列表
编辑数字2
因为我正在测试PHP7RC3
重新运行基准测试(在同一台机器上)
$page='dog'代码>
Switch took 0.31698203086853
if took 0.18721604347229
needle haystack took 1.5701420307159
Switch took 0.018393993377686
if took 0.030646085739136
if(===) took 0.036449909210205
needle haystack took 0.045974969863892
$page='default'代码>
Switch took 0.46866297721863
if took 0.40072298049927
needle haystack took 1.6747360229492
Switch took 0.040921211242676
if took 0.085216999053955
if(===) took 0.1043848991394
needle haystack took 0.052649974822998
$page='不匹配'代码>
Switch took 0.52629804611206
if took 0.40276217460632
needle haystack took 1.6838929653168
Switch took 0.059795141220093
if took 0.080615997314453
if(===) took 0.10486197471619
needle haystack took 0.049200057983398
使用PHP7,针线和干草堆看起来最好200悬赏将因此获得。如果你想知道哪一个更快:配置文件还是基准测试。如果您想知道发生了什么,请转储字节码(VLD或DBG)并查看。要求对这三个问题进行深入的解释肯定太宽泛了。我想说in_array()是最慢的一个,但是。。。等待答案……:)@马里奥:这对我来说是一个进步。这个基准并不是真的可以推广的;运行时取决于设置了哪个值以及开关或是否必须运行的比较次数。你会发现你正在对这些东西进行微优化——与你的其他代码(数据库优化、减少循环等)相比,哇,这是一个非同寻常的答案,明天我将奖励你。哇!这是非常清楚和有益的。特别是大会。