关于php:哪个更快更好,Switch Case或if if else if?

Which is Faster and better, Switch Case or if else if?

哪种方法更好更快:如果还是切换?

1
2
3
4
5
6
7
8
9
10
11
12
if(x==1){
  echo"hi";
} else if (x==2){
  echo"bye";
}

switch(x){
  case 1
    ...
  break;
  default;
}


你的第一个例子是完全错误的。你需要的是elseif,而不是else

如果你使用if..elseif...switch主要是一个偏好问题。性能相同。

但是,如果您的所有条件都是x == value型,并且x在所有条件下都相同,那么switch通常是有意义的。如果有两个以上的条件,我也只使用switch

如果变量部分是函数调用,那么switch实际上会给您带来性能优势:

1
2
3
4
switch(some_func()) {
    case 1: ... break;
    case 2: ... break;
}

那么,some_func()只调用一次,while with

1
2
if(some_func() == 1) {}
elseif(some_func() == 2) {}

它将被调用两次——包括函数调用可能发生的副作用两次。但是,您可以一直使用$res = some_func();,然后在if条件下使用$res,这样您就可以一起避免这个问题。

一个你根本不能使用开关的情况是当你有更复杂的条件时——switch只适用于x == yy是一个常量。


根据phpbench.com,if/elseif速度稍快,特别是在使用严格比较(==)时。

enter image description here

但只有当你想在一个函数上削掉微秒,而这个函数将被调用数千次,这才是真正重要的。


一般规则是当条件数目大于3时(为了可读性)使用switch

if/else if/else更灵活(因此更好),但switch稍微快一点,因为它只计算一次条件,然后检查输出,而if每次都必须这样做。

编辑:好像switchif慢,我敢肯定,事实并非如此……


使用==时,与switch相比,if ... elseif的性能几乎相同。然而,当使用===时,if ... elseif的速度大约是3倍(根据phpbench)。

一般来说,当进行3次以上的比较时,您应该使用最可读的,并使用switch。如果性能是一个主要问题,并且您不需要进行任何类型的转换,那么使用if ... elseif===


这取决于使用情况。如果你有fxp状态(在线,离开,DND,离线…)它的更好的使用开关。

1
2
3
4
5
switch(status)
{
case 'online':
...
}

但是如果你想要这样的东西

1
if ((last_reply.ContainsKey(name)) && (last_reply[name] < little_ago))

1
if (msg.ToString()[0] == '!')

如果有的话,最好用。


在我看来,"if/else"比"switch"快但不比"switch"好。但我更喜欢这样:

1
echo ($x==1?"hi":($x==2?"bye":""));

如果你必须做1.2个案例,比如if/else if/else


我相信编译器会在一天结束时将它们转换成非常相似的代码,甚至可能是相同的代码。

除非你在做一些奇怪的事情,否则不要尝试对编译器进行优化。

此外,开发人员时间通常比运行时更重要(游戏除外),因此最好使其更易于阅读和维护。