+ =快于 - =?

AMC*_*der 6 c++ performance

完全披露 - 我的灵感来自Is x + =比x = x + a更快?

这且不说,我决定测试+=VS -=.简单的测试表明它们大致相同.然后我尝试了类似的东西:

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

并调用+=-=按比例给定的数字:

long long sum = 0;

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

所以,如果k是小的-=话会更频繁地被召唤(duuuh).我试过用k = 2它来提供更高比例的-=被叫,并且k = 5,它应该产生大约相同数量的-=+=.

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

Luc*_*ore 15

我会在Mysticial抓住这个并猜测之前跳进去:分支预测.

因此,它不是-=VS +=.

当条件x[j] < k几乎总是true或者false可以在大约相同数量的数字可以评估时,可以更好地预测条件.

因为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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,越接近k混乱状态,程序需要更多.接近尾声,大约需要一半的时间.

  • 所以你预测它是关于分支预测 (4认同)