繁体   English   中英

消除低效率的代码

[英]Eliminate inefficient code

我想知道一个效率不如另一个(下面的两个代码)吗?

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

要么

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

它们不是等效的,第二个是“更正”的

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

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

另外,进行这种微优化几乎是不明智的-您浪费时间在最多只能使用一两个汇编指令的差异上,甚至在不关键的代码路径中也是如此。 在这里,在性能上没有真正的区别的地方,真正要做的优化是使代码更清晰。

真正的优化关心这些微差异(编译器可能已经采取了这些微差异),而是对代码进行概要分析以找到真正的瓶颈。

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

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

// OR

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

但是,还有另一个原因是两者不相等: ==运算符的优先级高于&运算符( 请参见此链接 )。 因此,您的第一个表达式的计算结果如下:

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) {}
}

为了避免这种错误,我总是使用圆括号来强制执行优先级,只要从人类的角度来看(即使编译器永远不会发现歧义),就应该假定读者不知道模棱两可。实际的优先次序是。 这具有使代码更易于阅读的额外好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM