7

我想知道,如果我们if-else有条件,那么检查计算效率更高的是:使用等于运算符还是不等于运算符?有什么区别吗?

例如,以下哪一项在计算上是有效的,以下两种情况都会做同样的事情,但哪一种更好(如果有任何区别)?

情况1:

if (a == x)
{
    // execute Set1 of statements
}
else
{
    // execute Set2 of statements
}

案例二:

if (a != x)
{
    // execute Set2 of statements
}
else
{
    // execute Set1 of statements
}

这里的假设大部分时间(比如 90% 的情况)a将等于x. a两者x都是无符号整数类型。

4

14 回答 14

10

通常你应该考虑的是;编写此代码的最简单和最清晰的方法是什么?恕我直言,第一个肯定是最简单的(不需要!)

在性能方面没有差异,因为代码可能编译为相同的东西。(当然应该在 JIT for Java 中)

对于 Java,JIT 可以优化代码,因此分支预测首选最常见的分支。

于 2012-12-12T12:16:35.020 回答
10

通常,您使用哪个运算符对性能无关紧要。但是,对于分支,建议首先出现 if 语句的最可能结果。

于 2012-12-12T12:15:26.533 回答
8

在这个简单的情况下,它没有任何区别。(假设ax是基本类型)如果它们是重载的类类型,operator ==或者operator !=它们可能不同,但我不会担心。

对于后续循环:

if ( c1 )   { }
else if ( c2 ) { }
else ...

应将最可能的条件放在首位,以防止对其他条件进行无用的评估。(同样,这里不适用,因为你只有一个else)。

于 2012-12-12T12:15:36.260 回答
5

GCC 提供了一种方法来通知编译器表达式的可能结果:

if (__builtin_expect(expression, 1))
…

这个内置的计算结果为expression,但它通知编译器可能的结果是 1(true对于布尔值)。expression要使用它,您应该尽可能清楚地编写(对于人类),然后将第二个参数设置为最有可能成为结果的值。

于 2012-12-12T13:24:26.660 回答
4

没有区别。

x86 CPU 架构有两个用于条件跳转的操作码

JNE (jump if not equal)
JE (jump if equal)

通常它们都占用相同数量的 CPU 周期。

即使他们不这样做,您也可以期望编译器为您做这些微不足道的优化。写出最易读的内容以及使您的意图更清晰的内容,而不是担心微秒。

于 2012-12-12T12:19:06.310 回答
4

如果您曾经设法编写一段 Java 代码,该代码可以被证明以一种方式比另一种方式更有效,那么您应该发布您的结果并针对您观察到差异的任何实现提出问题。

更重要的是,仅仅问这种问题应该是有问题的迹象:这表明您将注意力和精力集中在代码的错误方面。现实生活中的应用程序性能总是受到架构不足的影响;从来没有像这样的担忧。

于 2012-12-12T12:29:50.657 回答
2

早期优化是万恶之源

即使对于分支预测,我认为你也不应该太在意这一点,直到真的有必要。

正如彼得所说,使用最简单的方法。

于 2012-12-12T12:19:08.363 回答
2

让编译器/优化器完成它的工作。源代码应该以最易读的方式表达你的意图,这是一个普遍的经验法则(现在大多数情况下)。您正在将它写给另一个人(而不是计算机),一年后您自己或您的队友将需要以更少的努力来理解您的代码。

于 2012-12-12T12:35:24.403 回答
1

它不应该对性能产生任何影响,但您会考虑最容易阅读的内容。然后,当您回顾您的代码或有人在查看它时,您希望它易于理解。

于 2012-12-12T12:19:37.907 回答
0

它们之间的性能差异可以忽略不计。因此,只需考虑代码的可读性。为了可读性,我更喜欢在 If 语句中有更多代码行的那个。

if (a == x) { 
    // x lines of code
} else {
    // y lines of code where y < x
}
于 2012-12-12T13:10:54.137 回答
0

如果第一个条件在大多数情况下都是正确的,它有一点优势(从可读性的角度来看)。以您可以最好地阅读它们的方式编写条件。否定条件不会从速度中受益

于 2012-12-12T12:17:25.317 回答
0

大多数处理器使用电子门进行等式/不等式检查,这意味着一次检查所有位。因此它应该没有什么区别,但是您想要真正优化您的代码,最好自己进行基准测试并检查结果。
如果你想知道这样优化是否值得,想象一下你会对屏幕上的每个像素或类似的场景进行多次检查。恕我直言,优化总是值得的,即使只是为了教自己好习惯;)

于 2012-12-12T12:43:14.713 回答
0

只有您一开始使用的非否定方法似乎是最好的。

于 2012-12-12T12:51:00.127 回答
0

唯一确定的方法是编写两个版本并测量它们的性能。如果差异只有一个百分比左右,请使用更清楚地传达意图的版本。

不太可能看到两者之间的显着差异。

于 2012-12-12T12:54:43.760 回答