在C++中进行比较的性能(foo> = 0 vs. foo!= 0)

Pau*_*aul 2 c++ performance

我最近在编写一段代码,其中性能非常重要,基本上我有以下情况:

int len = some_very_big_number;
int counter = some_rather_small_number;

for( int i = len; i >= 0; --i ){
    while( counter > 0 && costly other stuff here ){
        /* do stuff */
        --counter;
    }
    /* do more stuff */
}
Run Code Online (Sandbox Code Playgroud)

所以这里我有一个经常运行的循环,并且对于一定数量的运行,while块也将被执行,直到变量counter减少到零,然后不会调用while循环,因为第一个表达式将为false.

现在的问题是,如果使用
counter > 0counter != 0?之间的性能有差异?
我怀疑会有,有没有人知道这方面的具体细节.

Jim*_*wis 33

衡量就是知道.


Ara*_*raK 19

你认为这将解决你的问题!:d

    if(x >= 0)
00CA1011  cmp         dword ptr [esp],0 
00CA1015  jl          main+2Ch (0CA102Ch) <----
...
    if(x != 0)
00CA1026  cmp         dword ptr [esp],0 
00CA102A  je          main+3Bh (0CA103Bh) <----
Run Code Online (Sandbox Code Playgroud)

  • 只是为了扩展一下,在x86中,`je`和`jl`都根据标志跳转.但是,在两种情况下,标志都是由`cmp`生成的,因此*calculate*具有相同的性能.基于不同标志的*决定*也将具有相同的延迟,因为标志已经可用,并且检查标志是否同时为所有标志并行完成. (7认同)
  • ...然后你可能会开始怀疑你的CPU的分支预测器哪个更频繁地正确. (3认同)

T.E*_*.D. 19

在编程中,以下陈述是指示地狱之路的标志:

我最近一直致力于一段代码,其中性能非常重要

以最干净,最容易理解的方式编写代码.期.

完成后,您可以测量其运行时间.如果花费的时间太长,请测量瓶颈,加快最大的瓶颈.继续这样做,直到它足够快.

由于错误地强调盲目优化而失败或遭受灾难性损失的项目清单是巨大而悲惨的.不要加入他们.


Cel*_*ish 8

我认为你花时间优化错误的东西."这里代价高昂的其他东西","做东西"和"做更多东西"更重要的是要看.这就是我打赌会带来巨大性能改进的地方.