2016-04-11 15 views
-6

私の友人と私はループのためにこれらの3のどれを議論しているC++(ちょうど彼らがループ10回意志例示の目的のために)で、より効率的である:forループはC++でより効率的ですか?職場で

//A) 
for(int i = 0; i<10; i++) 
{ 
    // Do stuff. 
} 

//B) 
for(int i = 0; i< 10; ++i) 
{ 
    // Do stuff. 
} 

//C) 
for(int i = 11; --i;) 
{ 
    // Do stuff. 
} 

// D) 
// Anything you guys know that is better. 

だから、1が最高、なぜでしょうか?

+0

3番目のものは、最初の2個とは異なる方法で繰り返します。つまり、コンパイラはそれらを等価なものに最適化するでしょう。 – Banex

+0

コンパイラは最適化を行います。 – Dummy00001

+1

あなたはそれらを測定しましたか? 「やること」が何であるかに大きく依存する。 – Niall

答えて

6

Any decent compiler will not penalize you for which ever version you use. ご覧のとおり、すべてのループは同じコードになっていて、たぶん1つの命令が並べ替えられています。

あなたがしたいことを最もわかりやすく伝えるものを探してください。

あなたがいないの最適化で何が起こるかに興味がある場合は、ここであなたが行く:

Example A

Example B

Example C

あなたが見ることができるように、AとBはまったく同じを作りますコードは最適化されていなくても、Cは実際にの指示(私の意見では、はるか読みにくい)!

コードはG ++ 5.3で解析されていますが、結果は異なるコンパイラによって異なる場合があります。要点は、マイクロ(ナノ?)最適化です。これらのループはどのように効率的

+0

実際、この答えはコンパイラによって異なります。 Clangを試してみると、結果は異なります。 IMOでは、アセンブラコードを少なくしてCを実装できます。 いずれにせよ、リンクのための良い点、ありがとう。 –

+0

@AdrianMaire確かに、各コンパイラは、必要な方法を最適化する(またはしない)ことができます。要点は、これが本当に最善のマイクロ最適化であるということです。 – Banex

2

通常、プリインクリメント/プリデクリメントは、ポストインクリメント/ポストデクリメントよりも高速です。なぜなら、<より前のポストインクリメント/ポストデクリメントは、返すために一時的な値を保存する必要があるからです。これは、プラットフォーム/コンパイラによっては結果がまったく同じである可能性があるintの場合とは異なる場合があります。いずれにしても、前もって<>より遅いとは思わない。

特定のアーキテクチャでは、「==」の方がパフォーマンスが優れています。 (オプションC)

最終回答: パフォーマンスはおそらく似ているか等しいです。特定のケースでは、パフォーマンスがおそらくもっと速くなる可能性があります。下側は、コードがやや曖昧なので、私は2番目のオプションをお勧めします。

+0

これは私たちが探していたものでした。 – Tohaveaname

0

は主に実装されている方法を効率的

// Do stuff. 

に依存します。今までにループを書く方法の効率に顕著な違いがあった場合、ループ全体がプログラム全体の実行速度にほとんど影響しない可能性があります(これは、// Do stuffがループに要した総時間のわずかな部分)。

一般に、コードをプロファイリングしない限り、コードをプロファイリングしない限り、最適化するべきではありません。

関連する問題