哪个更快更好,Switch Case还是其他如果?

时间:2012-05-27 09:51:23

标签: php performance if-statement switch-statement

哪种方法更好更快:if还是switch?

if(x==1){
  echo "hi";
} else if (x==2){
  echo "bye";
}

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

9 个答案:

答案 0 :(得分:124)

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

如果您使用if..elseif...switch主要是偏好问题。表现是一样的。

但是,如果您的所有条件都属于x == valuex在每种情况下都相同,switch通常都有意义。我还只使用switch,如果超过例如两个条件。

switch实际上给你带来性能优势的情况是变量部分是函数调用:

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

然后使用

仅调用some_func()一次
if(some_func() == 1) {}
elseif(some_func() == 2) {}

它会被调用两次 - 包括两次函数调用的可能副作用。但是,您始终可以使用$res = some_func();,然后在$res条件中使用if - 这样您就可以完全避免此问题。

无法使用开关的情况是,当您有更复杂的条件时,switch仅适用于x == yy为常量值

答案 1 :(得分:21)

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

enter image description here

但是,如果你想在一个被调用数千次的函数上削减微秒,它才真正重要。

答案 2 :(得分:14)

一般规则是使用switch只要条件数大于3 (为了便于阅读)。

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

编辑:看起来像switch is slower than if毕竟,我发誓这不是这种情况......

答案 3 :(得分:2)

取决于使用情况。如果你有fxp状态(在线,离开,dnd,离线......),最好使用开关。

switch(status)
{
case 'online':
...
}

但如果你想要这样的东西

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

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

如果不这样做会更好用。

答案 4 :(得分:2)

使用==时,与if ... elseif相比,switch的效果几乎相同。但是,使用===时,if ... elseif的速度提高约3倍(根据:phpbench)。

通常,您应该使用最具可读性的内容,并在进行3次以上比较时使用switch。如果性能是一个主要问题,并且您不需要进行任何类型转换,请将if ... elseif===一起使用。

答案 5 :(得分:1)

在我看来,“if / else”更快但不比switch更好 但我更喜欢这个:

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

如果你必须做1,2个案例,如if / else if / else

答案 6 :(得分:1)

我发现了这篇文章:https://gist.github.com/Jeff-Russ/2105d1a9e97a099ca1509de1392cd314,它表示使用===时,switch / case比if / elseif更快。

它们还指示嵌套的if语句,这更有意义,并且可以提供更好的结果。

他们的时间:

嵌套if / elseif ===:0.25623297691345(嵌套IF)

开关/盒:0.33157801628113(SWITCH CASE)

if / elseif ===:0.45587396621704(平IF)

仅当===时:0.45587396621704(仅限IF)

答案 7 :(得分:0)

我相信编译器会在一天结束时将它们变成非常相似或甚至相同的代码。

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

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

答案 8 :(得分:0)

switch 比 if 快,因为 switch 使用跳转表,跳转表是编译器在编译时制作的,由 cpu/os 运行。例如,如果您有 100 个案例,并且您将在第 100 个案例中获得您的价值,那么您认为它会运行所有 99 个条件吗...不..它会在跳转表的帮助下直接跳转到第 100 个..so我们如何证明这一点?...如果您在开始时编写 default 语句然后运行该程序,您是否会获得默认值,因为它是在开始时?不..你会因为跳转表得到你想要的答案..它知道默认值在哪里以及你指定的值在哪里,它会直接带你到你想要的答案.. 谈论哪个更好...... 可以在 if 中完成的所有工作都可以在 switch 中完成。 但是对于较小的条件,如果更好,而对于更多的条件,则切换......就像最多 3 个条件,如果是好的......之后一个优秀的程序员使用 switch..这就是全部