消除低效的代码

时间:2013-03-13 02:53:46

标签: c++ performance optimization

我想知道一个人是否效率低于另一个人(下面两个代码)?

if ( abc & myType == myType ) 
{
    if (myValue)
    {
        // do something
    }
}

OR

if ( (abc & myType) && myValue ) 
{
    // do something
}

2 个答案:

答案 0 :(得分:4)

它们不等同,“纠正”的第二个是

if ( (abc & myType == myType) && myValue ) 
{
    // do something
}

在这种情况下,任何体面的编译器都会为两者发出相同的代码。

此外,进行这种微优化几乎从不明智 - 你浪费时间来处理一个或两个汇编指令的差异,甚至可能在不重要的代码路径中。在这里,性能没有真正的差异,真正的优化是明确你的代码。

真正的优化是关于关心这些微差异(可能已经由编译器采用),而是分析代码以找到真正的瓶颈

答案 1 :(得分:4)

其他一些人指出,由于这个原因,这两者并不相同:

if (abc & myType == myType ) 
{
    if (myValue) {}
}

// OR

if ( (abc & myType) && myValue ) // missing myType == myType
{}

然而,第二个原因是两者不相等:==运算符的优先级高于&运算符(see this link)。因此,您的第一个表达式的计算结果如下:

if (abc & myType == myType) // Evaluates to (abc & true)
{
    if (myValue) {}
}

您可能打算这样做:

if ((abc & myType) == myType) // Now the bitwise and happens before
                              // the comparison is made
{
    if (myValue) {}
}

为了避免这种类型的错误,我总是使用括号来强制执行优先级,只要从 human的角度出现任何歧义的可能性(即使编译器永远不会发现它有歧义),假设读者不知道实际的优先级是什么。这样可以使代码更易于阅读。