-2

この構造体があるとしましょう

struct structure
{
    type element;
    int size;
}

私たちはメインにいて、何かを繰り返したいと思っています。

速いですか

for ( int i = 0; i < structure.size; ++i )

また

int size = structure.size;
for ( int i = 0; i < size; ++i )

最初のメソッドの構造への継続的なバインドまたはメモリの追加スペース、およびメソッドn.2の最初の行で最初の変数を作成するために費やされた時間の重みは大きくなりますか?

他に違いは見当たらないので、よろしければシェアしてください!

編集:質問を編集したので、簡潔で、シンプルで、簡単に答えられるようになりました。あなたがそれに与える投票を再考してください。ありがとうございました。

4

5 に答える 5

3

どちらかを選択するのには十分な理由があるかもしれません。最初の例のループの内容がの値を変更した場合、structure.sizei現在の値に対して継続的にチェックされます。ただし、2番目の選択肢でsizeは、変更されstructure.sizeません。どちらが必要かは、問題によって異なります。しかし、私はおそらく代わりにsize呼ばれるように変更するでしょう。initialSize

そうでない場合は、そのようなマイナーな「最適化」について考えるのをやめ、代わりに最も読みやすいものについて考える必要があります。不要な変数名が導入されないため、最初の選択肢をお勧めします。同じことを行う2ビットのコードがある場合は、コンパイラーを信頼して、それを行う最適な方法を見つけてください。プログラムに何をさせたいかをコンパイラーに伝えるのはあなたの仕事です。可能な限り最善の方法でそれを行うのはコンパイラの仕事です。

これが必要な最適化であると測定によって判断した場合(これまでにそうなるとは想像できません)、最も速く測定するものを選択する必要があります。

于 2013-03-02T22:55:33.403 に答える
0

コンパイラがこのようなマイクロ最適化を実行できるようにする必要があります。読み取り可能なコードを記述して機能させ、低速で実行する場合はプロファイルを作成し、本当に必要な場所で最適化します。

ループ内で関数を呼び出す場合、この構造を変更でき、コンパイラはその実装にアクセスできませんが、メモリからstructure.sizeをリロードする必要がないというヒントをコンパイラに与えるため、2番目のバリアントが役立つ場合があります。constの使用をお勧めします:

const int size = structure.size;
for ( int i = 0; i < size; ++i ) {
   somefunc( &structure );
}
于 2013-03-02T22:53:26.980 に答える
0

それが本当にゴミの最適化を備えた古代のコンパイラでない限り、コンパイルされたコードにこれと実際の違いがある可能性はほとんどありません。gcc、clang、MSVC、またはIntelのC ++コンパイラのようなものは、これらのシナリオでまったく同じコードを生成します。

もちろん、ループの条件内で関数の呼び出しを開始し、関数によって処理されるデータがループによって変更された場合、たとえば

std::string str;

cin >> str;
for(int i = 0; i < str.size(); i++)
{
    if (str[i] > 'a') 
       str+= 'B';
}

それから私たちは別の話をします...

于 2013-03-02T22:55:05.857 に答える
0

コンパイルについてどれだけ知っているかはわかりませんが、コンパイラのさまざまなフェーズの中に、コード最適化と呼ばれるフェーズがあります。これは、中間コードを改善しようとします(デッドコードの除去、ループ変換などのさまざまな最適化手法を実行します)。など)、より高速に実行されるマシンコードを生成できるようにします。

したがって、実際にはコンパイラが頭痛の種を処理し、パフォーマンスの問題に気付くことはないと思います。

于 2013-03-02T22:56:32.307 に答える
-1

最初の方法では、構造が参照変数またはメンバー変数である場合、このブロックから変更されたかどうかを判断する方法がないため、CPUキャッシュに適切に格納されません。

2番目の方法では、サイズは現在のコードブロックのローカル変数であるため、キャッシュに適切に格納されます。

したがって、新しい変数を作成しても、2番目の方法の方が高速です。

より完全な説明については、Load-Hit-Storeを参照してください。

于 2013-03-02T23:03:33.240 に答える