完全披露 - 我受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
调整后,-=
和+=
的数量相同。
妙语:调用-=
的速度大约是调用+=
的两倍。为什么在这种情况下会更有效率?
答案 0 :(得分:15)
I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.
所以,这不是-=
vs +=
。
当条件x[j] < k
几乎总是true
或false
时,可以更好地预测条件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}}越接近混乱状态,程序需要更多。接近尾声,大约需要一半的时间。