6

完全披露 - 我的灵感来自Is x += a faster 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)。我试过 with k = 2which 会给出更高比例的-=被叫, and with k = 5,这应该产生大约相同数量的-=and +=

妙语: call-=比 call 快两倍+=。为什么在这种情况下它会更有效率?

4

1 回答 1

15

我会在 Mysticial 掌握这一点并猜测之前跳进去:分支预测

所以,这不是-=vs +=

当它几乎总是或当它可以评估的数字数量大致相同时,x[j] < k可以更好地预测该条件。truefalse

因为k = 2,十分之一的人会评估为false.

因为k = 5,它们将大致相同并且随机分布,因此更难预测。

编辑:见http://ideone.com/1PYMl - 所有额外的东西都是为了防止未使用的代码优化(couts)。

tl; dr:不同的结果k

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混乱变化的条件,程序需要的时间就越多。接近尾声,大约需要一半的时间。

于 2012-09-18T18:14:03.170 回答