哪个更快,更好,切换案例还是如果?
哪个更好,最快的方法是:如果还是切换?
if(x==1){ echo "hi"; } else if (x==2){ echo "bye"; } switch(x){ case 1 ... break; default; }
你的第一个例子是错误的。 你需要elseif
而不是else
。
如果您使用if..elseif...
或者switch
主要是一个偏好的问题。 性能是一样的。
但是,如果所有条件都是x == value
types的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();
然后在你的if
条件中使用$res
,这样就可以避免这个问题。
根本不能使用开关的情况是当你有更复杂的条件 – switch
只适用于x == y
, y
是一个常数值。
一般情况下, 只要条件数大于3 (为了便于阅读),就使用switch
。
if
/ else if
/ else
更灵活(因此更好),但是switch
稍快,因为它只计算一次条件,然后检查输出,而if
每次都必须这样做。
编辑:看起来像switch
比if
毕竟,我可以发誓,这是不是这样的情况…
根据phpbench.com ,如果/ elseif稍微快一些,尤其是使用严格比较(===)的时候。
但是,如果你想在一个被称为数千次的函数上减掉微秒,那真的很重要。
这取决于使用情况。 如果你有fxp的状态(在线,离开,dnd,离线…)更好的使用开关。
switch(status) { case 'online': ... }
但是,如果你想要这样的事情
if ((last_reply.ContainsKey(name)) && (last_reply[name] < little_ago))
要么
if (msg.ToString()[0] == '!')
如果还有其他更好的用途。
我相信,编译器会在一天结束时将它们变成非常相似的,甚至相同的代码。
除非你做了奇怪的事,否则不要尝试为编译器做优化。
另外,开发人员的时间通常比运行时间更重要(除了游戏),所以更好的方法是使其更具可读性和可维护性。
在我看来,“如果/其他”是更快但不比开关更好,但我更喜欢这个:
echo ($x==1?"hi":($x==2?"bye":""));
如果你必须做1,2例如if / else if / else
使用==
,与switch
相比, if ... elseif
性能几乎相同。 但是,使用===
, if ... elseif
约快3倍(根据: phpbench )。
一般来说,当进行3次以上的比较时,你应该select最易读和使用switch
。 如果性能是一个主要问题,并且不需要进行任何types转换,那么使用if ... elseif
和===
。