1

ほぼ同じループを 2 つ取得しましたが、パフォーマンスに顕著な違いがありました。どちらも MSVC2010 でテストされ、システム ~2.4 GHZ および 8GB RAM で実行されました。

以下のループの実行には約 2500 ミリ秒かかります

for (double count = 0; count < ((2.9*4/555+3/9)*109070123123.8); count++)
;                   

そして、このループは1ミリ秒未満で実行されます

for (double count = ((2.9*4/555+3/9)*109070123123.8); count >0; --count)
;

ここで何がそんなに大きな違いを生んでいるのですか?1 つはポスト インクリメントを取得し、もう 1 つはプリ インクリメントを使用すると、このような大きな違いが生じる可能性がありますか?

4

2 に答える 2

5

最適化なしでコンパイルしているため、比較は無駄です。(最適化をオンにした場合、そのコードは完全に切り取られます)。

最適化を行わないと、最初のループの各反復で計算が実行される可能性がありますが、2 番目のループでは、最初に初期化するときに 1 回だけ計算が実行されますcount

最初のループを次のように変更してみてください

auto max = ((2.9*4/555+3/9)*109070123123.8);
for (double count = 0; count < max; count++)
;   

次に、デバッグ ビルドのプロファイリングを停止します。

于 2013-04-06T10:19:09.063 に答える
2

最初のループcount < ((2.9*4/555+3/9)*109070123123.8)ではループのたびに計算されますが、2 番目のループでは 1 回計算され、ループのたびcount = ((2.9*4/555+3/9)*109070123123.8)にデクリメントされます。

于 2013-04-06T10:20:31.017 に答える