C++ 什么是有效的检查:等于或不等于?

C++ 什么是有效的检查:等于或不等于?,c++,c,if-statement,C++,C,If Statement,我想知道,如果我们有if-else条件,那么在计算上更有效的检查方法是什么:使用等于运算符还是不等于运算符?有什么区别吗 例如,以下哪一项在计算上是有效的,下面两种情况都会做相同的事情,但哪一项更好(如果有任何差异) 案例1: if (a == x) { // execute Set1 of statements } else { // execute Set2 of statements } if (a != x) { // execute Set2 of state

我想知道,如果我们有
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
}
案例2:

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
都是无符号整数类型。

通常,使用哪种运算符对性能没有影响。但是,对于分支,建议将if语句最可能的结果放在第一位。

在这个简单的例子中,这没有什么区别。(假设
a
x
是基本类型)如果它们是重载
运算符==
运算符的类类型=它们可能不同,但我不担心

对于后续循环:

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

最有可能的情况应该放在第一位,以防止对其他情况进行无用的评估。(再次,这里不适用,因为你只有一个代码>另外的< /代码>)。

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

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

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

如果第一个条件在大多数情况下都是正确的,那么它有一点优势(从可读性的角度来看)。
写下条件,这样你才能读得最清楚。通过否定一个条件,你将不会从速度中获益,因为没有区别

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

JNE (jump if not equal)
JE (jump if equal)
通常它们都使用相同的CPU周期数

即使他们不这样做,你也可以期望编译器为你做这些琐碎的优化。写下最具可读性的内容,以及让你的意图更加清晰的内容,而不是担心几微秒

早期优化是万恶之源

即使对于分支预测,我认为您也不应该太在意这一点,直到它确实是必要的


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

< P>不应该有什么不同的表现,但你考虑什么是最容易阅读。然后,当您回顾代码时,或者如果有人在看代码时,您希望代码易于理解。

如果您曾经成功地编写了一段Java代码,并且证明这种方法比另一种方法更有效,您应该发布您的结果,并针对您观察到差异的任何实现提出问题


更重要的是,仅仅问这类问题应该是有问题的迹象:这表明您将注意力和精力集中在代码的错误方面。现实生活中的应用程序性能总是受到架构不足的影响千万不要因为这样的问题而

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

大多数处理器使用电子门进行相等/不相等检查,这意味着所有位都将一次检查。因此,这应该没有什么区别,但如果你想真正优化你的代码,最好是自己进行基准测试并检查结果。

如果你想知道这样优化是否值得,想象一下你会对屏幕上的每个像素进行多次检查,或者类似的场景。我知道,优化总是值得的,即使只是为了教自己养成好习惯;)

只有您最初使用的非负面方法似乎是最好的。

唯一确定的方法是对两个版本进行编码并衡量它们的性能。如果差异仅为百分之一左右,则使用更清楚地传达意图的版本


你不太可能看到两者之间的显著差异

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

if (a == x) { 
    // x lines of code
} else {
    // y lines of code where y < x
}
如果(a==x){
//x行代码
}否则{
//y代码行,其中y
GCC提供了一种方法,可以将表达式的可能结果通知编译器:

if (__builtin_expect(expression, 1))
…

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

我不确定操作方面,但是我倾向于将
最有可能的
情况放在if语句中,而将不太可能的情况放在else(ifs)中,特别是如果我们在一个循环中交谈。我认为在最好的情况下,它可以帮助CPU进行分支预测,但最有可能的是编译器已经以某种方式对其进行了优化:)我建议您仔细阅读分支预测,并考虑您的假设,分支预测器将优化事情,这样两者都不会变慢。如果90%的时间a==x,那么,您当前的结构看起来更好me@TonyTheLion:在不同的处理器型号中,分支预测差异很大。当分支预测是静态的(因此,不是t