2012-09-18 9 views
6

完全な開示は - 私はさておき、私は+=-=をテストすることを決めIs x += a quicker than x = x + a?+は+ =より速いですか?

に触発されました。シンプルなテストでは、同じことが分かります。 kは、たとえば、小さな、-=はduuuh(より頻繁に呼ばれるになるだろうされている場合、その

long long sum = 0; 

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

:それから私は次のように何かを試してみました:

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

を、与えられた数に比例し+=-=を呼び出します)。私は、-=と呼ばれ、k = 5とのより高い割合を与えるk = 2を試しました。これは、およそ同数の-=+=を生成するはずです。

パンチライン:-=を呼び出すと、+=を呼び出すより約2倍高速です。この場合、なぜより効率的になるのでしょうか?

+4

「インスピレーションを受けた」より良いことがあると思います。 – Mysticial

+0

おそらくA + BがちょうどA +(-B)であると考えて、A + Bにちょっとした利点があるかもしれません。 – nullpotent

+7

2つの言葉:分岐予測。ヒント:k = 8を試してください –

答えて

15

I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.

だから、それは+=-=ではありません。

条件x[j] < kは、ほとんど常にtrueまたはfalseのいずれかと評価できる数よりも多い場合よりもよく予測できます。

k = 2の場合、10の1はfalseと評価されます。

k = 5の場合、それらはほぼ同じでランダムに配信されるため、予測が難しくなります。

EDIT:http://ideone.com/1PYMlを参照してください。使用しないコードの最適化を防ぐために余分なものがあります(cout)。

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近いプログラムは、より多くかかり、カオス的に変化の状態になります。終了に向かって、それは約半分の時間がかかります。

+4

だから、それは分岐予測であると予測する –

+0

まったく同じことを言っていた。また、主な質問に答えるために、ほぼすべてのアーキテクチャで、add命令とsub命令は基本的に同じ時間を取るべきです。 – slugonamission

+0

@神秘的なちょっと - リンク:P –

関連する問題