哪个是更好和最快的方法: if 或 switch ?
if(x==1){
echo "hi";
} else if (x==2){
echo "bye";
}
switch(x){
case 1
...
break;
default;
}
哪个是更好和最快的方法: if 或 switch ?
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
如果变量部分是函数调用,那么实际上会给您带来性能优势的一种情况:
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
值。
条件数大于 3 时使用switch
通用规则(为了便于阅读)。
if
//更灵活(因此更好),但else if
速度稍快,因为它只计算一次条件然后检查输出,而每次都必须这样做。else
switch
if
编辑:似乎switch
比if
毕竟慢,我可以发誓事实并非如此......
使用时,与相比的==
性能几乎相同。然而,当使用,大约快 3 倍(根据:phpbench)。if ... elseif
switch
===
if ... elseif
switch
通常,在进行 3 次以上的比较时,您应该选择最易读和使用的内容。如果性能是一个主要问题并且您不需要进行任何类型转换,那么使用if ... elseif
with ===
。
这取决于使用情况。如果您有 fxp 状态(在线、离开、dnd、离线...),则最好使用开关。
switch(status)
{
case 'online':
...
}
但是如果你想要这样的东西
if ((last_reply.ContainsKey(name)) && (last_reply[name] < little_ago))
或者
if (msg.ToString()[0] == '!')
否则它会更好地使用。
我发现这篇文章: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(仅当)
我相信编译器会在一天结束时将它们变成非常相似甚至相同的代码。
除非您正在做一些奇怪的事情,否则不要尝试对编译器进行优化。
此外,开发人员时间通常比运行时更重要(游戏除外),因此最好使其更具可读性和可维护性。
在我看来,“if/else”比 switch 更快但并不好,但我更喜欢这个:
echo ($x==1?"hi":($x==2?"bye":""));
如果你必须做 1,2 种情况,比如 if/else if/else
switch 比 if 快,因为 switch 使用跳转表,跳转表是在编译时由编译器制作并由 cpu/os 运行的。例如,如果您有 100 个案例,并且您将在第 100 个案例中获得您的价值,那么您认为它将运行所有 99 个条件......不......它会在跳转表的帮助下直接跳到第 100 个......所以我们如何证明这一点?...如果您在启动时编写默认语句然后运行程序,您将获得默认值,因为它是在启动时?不..由于跳转表,您将得到您想要的答案..它知道默认值在哪里以及您的分配值在哪里,它会直接将您带到您想要的答案..谈论哪个更好...每一项工作都可以如果可以在 switch 中完成,则可以在 switch 中完成。但是对于较小的条件 if 更好,对于更多条件 switch ..如果好的话,最多 3 个条件。