php中switch case和if效率,关于php:哪个更快更好,Switch Case或if if else if?

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

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实际上会给您带来性能优势:

switch(some_func()) {

case 1: ... break;

case 2: ... break;

}

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

if(some_func() == 1) {}

elseif(some_func() == 2) {}

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

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

这只是一个例子……不要深入研究代码。

仅仅因为某件事是一个例子并不意味着我们不能纠正你的错误…这是非常基本的,我们只是确保你有正确的理解。感谢@thiefmaster的帮助,因为他完美地回答了您的问题。

您已经说过,如果Elseif或Switch主要是一个偏好问题,并且性能是相同的,那么就使用它。我不同意你的看法,交换句会被评估一次,然后结果会与每一个案例进行比较,如果Elseif会被评估一次又一次。为此,我认为,根据情况的位置和方式,一个或另一个会更快和更合适。

实际上,有一种方法可以解决复杂的开关情况:=0:…;break;

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

c073136f0b2d5efd6434ff998a7fcd55.png

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

这是对答案的一个很好的贡献,但是您需要添加更多的信息,使其成为一个有用的答案。至少要链接到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,离线…)它的更好的使用开关。

switch(status)

{

case 'online':

...

}

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

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

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

如果有的话,最好用。

所以这取决于你喜欢什么样的书更容易阅读…

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

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

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

如果有数据和事实支持,意见是好的。

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值