Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在这种情况下会发生什么?_Php - Fatal编程技术网

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秒

使用VLD(PHP 5.6.4)输出的所有场景

开关

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()是最慢的一个,但是。。。等待答案……:)@马里奥:这对我来说是一个进步。这个基准并不是真的可以推广的;运行时取决于设置了哪个值以及开关或是否必须运行的比较次数。你会发现你正在对这些东西进行微优化——与你的其他代码(数据库优化、减少循环等)相比,哇,这是一个非同寻常的答案,明天我将奖励你。哇!这是非常清楚和有益的。特别是大会。