【发布时间】:2015-06-04 23:07:21
【问题描述】:
我们参与了关于如何使代码更高效以及关于if-else 上的分支主题的讨论,这个话题出现了。
考虑以下代码:
if (a==1) {
//... tasks
} else if (a==2) {
//... tasks
}
...
} else if (a==9) {
//... tasks
}
讨论证明,由于必须对代码的下半部分进行比较次数,上层代码的效率低于下层代码。
考虑这个替代方案:
if (a<=4) {
if (a==1) {
//... tasks
} else if (a==2) {
//... tasks
}
...
} else {
if (a==5) {
//... tasks
} else if (a==6) {
//... tasks
}
...
}
在上述情况下,检查a=5,6,7, or 8 需要较少的比较次数,并且显然更有效。但我从来没有遇到过他们使用这种逻辑的代码。大多数代码通常使用switch 语句或前面sn-p 中提到的普通if 条件。后一种代码真的更高效还是花费相同的时间?
编辑:以上只是一个例子。总体思路是从条件池中区分不相交的条件集,然后根据不相交的原因应用额外的条件。
【问题讨论】:
-
出于您提到的确切原因,Switch 语句通常以这种方式编译。因此,除非您有充分的理由,否则无需手动操作。
-
根据语言(或编译器/JIT 实现),
switch语句很可能实际上是一个表查找,因此是一次比较。 -
@Slanec,如果假设被比较的值不是整数并且由于某种原因我们不能使用
switch。那么将条件分解成不相交的集合(如果可能的话)然后应用额外的条件(如后者)是一种好习惯吗? -
如果
a==1几乎总是这样,第二个代码会更慢。这就是为什么编译器通常很难做出这些选择。最佳代码取决于数据。 -
@usr,没错,这个例子纯粹是为了写一个例子。我的意思是讨论在一组条件中有几个不相交的集合时的可能性。
标签: performance conditional-statements