6

完全な開示 - 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-=+=

オチ: 呼び出し-=は、 を呼び出すよりも約 2 倍高速です+=。この場合、なぜより効率的でしょうか?

4

1 に答える 1

15

Mystial がこれを把握して推測する前に、私は飛び込みます:分岐予測.

したがって、それは-=vsではありません+=

ほとんどの場合、またはどちらかに評価できる数値がほぼ同じ数である場合よりも、条件x[j] < kをより適切に予測できます。truefalse

の場合k = 2、10 人に 1 人が と評価され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 に答える