哪种方法更好更快:如果还是切换?
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;
} |
- 过早优化-这两个选项都不会节省任何明显的时间。选择对你来说更可读的东西。
- 由于"开关"没有比较,所以速度稍微快一点。
- @马杜克怎么能转换不做比较?
- @马杜克:你觉得x和1是怎么比较的?确切地说,在内部它还执行==比较。
- 先生,不要深究密码。我不是在问逻辑……我问哪种方法更好,是…还是换…
- @芭蕾舞团,见stackoverflow.com/q/7290889/632951
你的第一个例子是完全错误的。你需要的是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 == y,y是一个常量。
- 这只是一个例子……不要深入研究代码。
- 仅仅因为某件事是一个例子并不意味着我们不能纠正你的错误…这是非常基本的,我们只是确保你有正确的理解。感谢@thiefmaster的帮助,因为他完美地回答了您的问题。
- 您已经说过,如果Elseif或Switch主要是一个偏好问题,并且性能是相同的,那么就使用它。我不同意你的看法,交换句会被评估一次,然后结果会与每一个案例进行比较,如果Elseif会被评估一次又一次。为此,我认为,根据情况的位置和方式,一个或另一个会更快和更合适。
- 实际上,有一种方法可以解决复杂的开关情况:<?php$i=//int开关(真)case$i<0:…;break;case$i>=0:…;break;
根据phpbench.com,if/elseif速度稍快,特别是在使用严格比较(==)时。
但只有当你想在一个函数上削掉微秒,而这个函数将被调用数千次,这才是真正重要的。
- 这是对答案的一个很好的贡献,但是您需要添加更多的信息,使其成为一个有用的答案。至少要链接到phpbench.com的部分,并直接引用这个答案中的重要部分。我会编辑你的帖子,告诉你一个格式良好的答案是什么样子的。
- 尽可能添加源,更好的是添加文档的链接和引用。
一般规则是当条件数目大于3时(为了可读性)使用switch。
if/else if/else更灵活(因此更好),但switch稍微快一点,因为它只计算一次条件,然后检查输出,而if每次都必须这样做。
编辑:好像switch比if慢,我敢肯定,事实并非如此……
- 在你的基准测试中,switch和if/else只在两个选项上执行。我知道在C#中,例如switch将使用查找表,并且可以更快地从5个选项开始。我已经执行了与基准测试相同的性能测试,但是有10个选项,而不是2和switch似乎更快!
- 对于少量比较,是的。但正如黑继承人所提到的,其他情况并非如此。
- "*一般规则是使用……"[[需要引文]](en.wikipedia.org/wiki/weasel_word)。另请参阅stackoverflow.com/q/7290889/632951
使用==时,与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
我相信编译器会在一天结束时将它们转换成非常相似的代码,甚至可能是相同的代码。
除非你在做一些奇怪的事情,否则不要尝试对编译器进行优化。
此外,开发人员时间通常比运行时更重要(游戏除外),因此最好使其更易于阅读和维护。