Full disclosure – I was inspired by Is x += a quicker than x = x + a?
That aside, I decided to test += vs -=. Simple tests reveal they’re about the same. Then I tried something similar to:
std::vector<int> x;
for (int i = 0 ; i < 10000 ; i++)
x.push_back(rand()%10);
and call += and -= proportionally to a given number:
long long sum = 0;
for ( each number in the array )
if ( x[j] < k )
sum += x[j];
else
sum -= x[j];
so, if k is, say, small, -= would get called more often (duuuh). I tried with k = 2 which would give a higher proportion of -= called, and with k = 5, which should yield about the same number of -= and +=.
The punchline: calling -= is about twice as faster than calling +=. Why would it be more efficient in this case?
I’m gonna jump in before Mysticial gets a hold of this and guess: branch prediction.
So, it’s not the
-=vs+=.The condition
x[j] < kcan be better predicted when it’s almost alwaystrueorfalsethan it can be when there’s about the same number of numbers for which it can evaluate to either.For
k = 2, one in 10 will evaluate tofalse.For
k = 5, they’ll be about the same and distributed randomly, so harder to predict.EDIT: See http://ideone.com/1PYMl – all extra stuff is there to prevent unused code optimization (the
couts).tl;dr: Results for varying
k:as you can see, the closer
kgets to a chaotically varying condition, the program takes more. Towards the ends, it takes about half the time.