我想知道,如果我们有if-else
条件,那么检查计算效率更高:使用等于运算符或不等于运营商?是否有任何区别?
,例如,以下哪一项在计算上有效,下面的两种情况都会做同样的事情,但哪一种更好(如果有任何差异)?
情况1:
if (a == x)
{
// execute Set1 of statements
}
else
{
// execute Set2 of statements
}
案例2:
if (a != x)
{
// execute Set2 of statements
}
else
{
// execute Set1 of statements
}
这里假设大部分时间(例如90%的情况)a
将等于x
。 a
和x
都是无符号整数类型。
答案 0 :(得分:10)
通常,您使用哪个操作员的性能无关紧要。但是,建议分支时if语句的最可能结果首先出现。
答案 1 :(得分:9)
通常你应该考虑的是;编写此代码的最简单,最清晰的方法是什么?恕我直言,第一,积极是最简单的(不要求!)
在性能方面没有差异,因为代码很可能编译成同一个东西。 (当然应该在JIT for Java中)
对于Java,JIT可以优化代码,因此分支预测首选分支。
答案 2 :(得分:7)
在这个简单的例子中,它没有任何区别。 (假设a
和x
是基本类型)如果它们是具有重载operator ==
或operator !=
的类类型,它们可能会有所不同,但我不担心它
对于后续循环:
if ( c1 ) { }
else if ( c2 ) { }
else ...
应该首先考虑最可能的条件,以防止对其他人进行无用的评估。 (再次,这里不适用,因为你只有一个else
)。
答案 3 :(得分:5)
GCC提供了一种向编译器通知表达式可能结果的方法:
if (__builtin_expect(expression, 1))
…
此内置计算结果为expression
的值,但它通知编译器可能的结果为1(布尔值true
)。要使用它,您应该尽可能清楚地写expression
(对于人类),然后将第二个参数设置为最有可能成为结果的值。
答案 4 :(得分:3)
没有区别。
x86 CPU架构有两个用于条件跳转的操作码
JNE (jump if not equal)
JE (jump if equal)
通常它们都占用相同数量的CPU周期。
即使他们不这样做,你也可以期望编译器为你做这些微不足道的优化。写出最具可读性的内容,使你的意图更加清晰,而不是担心微秒。
答案 5 :(得分:3)
如果您曾经设法编写一段可以被证明比另一种更有效的Java代码,那么您应该发布您的结果,并针对您发现差异的任何实现提出问题。
更重要的是,只是提出这样的问题应该是一个有问题的迹象:这表明你正在把注意力和精力集中在代码的错误方面。真实的应用程序性能总是受到架构不足的影响; 从不来自此类问题。
答案 6 :(得分:2)
早期优化是万恶之源
即使对于分支预测,我认为你不应该太在意这一点,直到真的有必要。
正如彼得所说,用最简单的方法。
答案 7 :(得分:2)
让编译器/优化器完成它的工作。 一般的经验法则(现在大多数情况下)源代码应以最易读的方式表达您的意图。你将它写给另一个人(而不是计算机),一年后你自己或你的队友需要用更少的努力来理解你的代码。
答案 8 :(得分:1)
它不应该在性能方面有任何不同,但你会考虑最容易阅读的内容。然后,当您回顾您的代码或者有人正在查看它时,您希望它易于理解。
答案 9 :(得分:0)
答案 10 :(得分:0)
大多数处理器使用电门进行相等/不等式检查,这意味着一次检查所有位。因此它应该没有区别,但是你想要真正优化你的代码,最好自己对事物进行基准测试并检查结果 如果你想知道是否值得这样优化,想象你会对屏幕中的每个像素进行多次检查,或者像这样的场景。 Imho,它是值得优化的,即使它只是教自己好习惯;)
答案 11 :(得分:0)
只有你在第一次使用的非负面方法似乎是最好的。
答案 12 :(得分:0)
唯一可以确定的方法是对两个版本进行编码并衡量其性能。如果差异仅为百分之一左右,请使用更明确传达意图的版本。
非常你不太可能看到两者之间存在显着差异。
答案 13 :(得分:0)
它们之间的性能差异可以忽略不计。所以,只要考虑代码的可读性。为了便于阅读,我更喜欢在If语句中有更多代码行的那个。
if (a == x) {
// x lines of code
} else {
// y lines of code where y < x
}