+ =快于 - =?

时间:2012-09-18 18:11:08

标签: c++ performance

完全披露 - 我受Is x += a quicker than x = x + a?

的启发

除此之外,我决定测试+= vs -=。简单的测试表明它们大致相同。然后我尝试了类似的东西:

std::vector<int> x;
for (int i = 0 ; i < 10000 ; i++)
   x.push_back(rand()%10);

并按比例调用+=-=

long long sum = 0;

for ( each number in the array )
    if ( x[j] < k )
        sum += x[j];
    else
        sum -= x[j];

所以,如果k比较小,-=会被更频繁地调用(duuuh)。我尝试使用k = 2,其中-=调用的比例更高,而k = 5调整后,-=+=的数量相同。

妙语:调用-=的速度大约是调用+=的两倍。为什么在这种情况下会更有效率?

1 个答案:

答案 0 :(得分:15)

I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.

所以,这不是-= vs +=

当条件x[j] < k几乎总是truefalse时,可以更好地预测条件k = 2,而它可以评估相同数量的数字。< / p>

对于false,十分之一将评估为k = 5

对于cout,它们将大致相同并随机分布,因此难以预测。

编辑:请参阅http://ideone.com/1PYMl - 所有额外的内容都是为了防止未使用的代码优化(k s)。

tl; dr:变化k: 1 Time: 280 k: 2 Time: 360 k: 3 Time: 440 k: 4 Time: 520 k: 5 Time: 550 k: 6 Time: 510 k: 7 Time: 450 k: 8 Time: 360 k: 9 Time: 260 的结果:

k

正如您所看到的,{{1}}越接近混乱状态,程序需要更多。接近尾声,大约需要一半的时间。