77

哪个是更好和最快的方法: if 或 switch ?

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

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

9 回答 9

157

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

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

但是,如果您的所有条件都是在每种条件下都相同的类型,x == value通常是有意义的。如果有两个以上的条件,我也只会使用。xswitchswitch

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 的情况是当您有更复杂的条件时 -switch仅适用于x == y恒定y值。

于 2012-05-27T09:53:04.303 回答
36

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

在此处输入图像描述

但是,如果您想在将被调用数千次的函数上减少微秒,这才是真正重要的。

于 2016-12-18T02:20:39.573 回答
20

条件数大于 3 时使用switch通用规则(为了便于阅读)。

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

编辑:似乎switchif毕竟慢,我可以发誓事实并非如此......

于 2012-05-27T10:51:40.967 回答
4

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

switch通常,在进行 3 次以上的比较时,您应该选择最易读和使用的内容。如果性能是一个主要问题并且您不需要进行任何类型转换,那么使用if ... elseifwith ===

于 2017-05-13T14:27:06.360 回答
2

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

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

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

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

或者

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

否则它会更好地使用。

于 2012-05-27T09:55:19.887 回答
1

我发现这篇文章:https ://gist.github.com/Jeff-Russ/2105d1a9e97a099ca1509de1392cd314这表明 switch/case 比 if/elseif with === 更快。

它们还指示嵌套的 if 语句,这更有意义,也提供了更好的结果。

他们的时代:

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

开关/外壳:0.33157801628113(开关外壳)

if/elseif with === : 0.45587396621704 (FLAT IF)

仅当使用 === 时:0.45587396621704(仅当)

于 2020-06-25T09:29:52.327 回答
0

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

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

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

于 2012-05-27T09:55:50.193 回答
0

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

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

如果你必须做 1,2 种情况,比如 if/else if/else

于 2012-05-27T10:02:00.957 回答
0

switch 比 if 快,因为 switch 使用跳转表,跳转表是在编译时由编译器制作并由 cpu/os 运行的。例如,如果您有 100 个案例,并且您将在第 100 个案例中获得您的价值,那么您认为它将运行所有 99 个条件......不......它会在跳转表的帮助下直接跳到第 100 个......所以我们如何证明这一点?...如果您在启动时编写默认语句然后运行程序,您将获得默认值,因为它是在启动时?不..由于跳转表,您将得到您想要的答案..它知道默认值在哪里以及您的分配值在哪里,它会直接将您带到您想要的答案..谈论哪个更好...每一项工作都可以如果可以在 switch 中完成,则可以在 switch 中完成。但是对于较小的条件 if 更好,对于更多条件 switch ..如果好的话,最多 3 个条件。

于 2021-05-23T01:02:17.567 回答