完全披露 - 我的灵感来自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混乱状态,程序需要更多.接近尾声,大约需要一半的时间.