3

ループの反復ごとに大きなヒープ メモリのチャンクを割り当てると、パフォーマンスが大幅に低下しますか? もちろん、各反復の終わりに解放します。

別の方法は、ループに入る前に一度割り当て、すべての反復で繰り返し使用し、最終的にループを終了した後に解放することです。以下のコードを参照してください。

// allocation inside loop
for(int i = 0; i < iter_count; i++) {
    float *array = new float[size]();
    do_something(array);
    delete []array;
}

// allocation outside loop
float *array = new float[size]();
for(int i = 0; i < iter_count; i++) {
    do_something(array);
}
delete []array;
4

5 に答える 5

3

私はループの中でそれをすることは決してないだろう。メモリの割り当ては無料のイベントではありません。一度行うことは、何度も繰り返すよりも間違いなく好まれます。また、括弧なしで配列を割り当てることができ、問題ないはずです。

float *array = new float[size];
于 2010-08-05T05:53:07.500 に答える
2
  • 割り当てが一定時間であったとしても、Tの代わりにTxNがあります。さらに、チャンクのメモリ初期化がある場合(ゼロに設定されている場合でも)、キャッシュを繰り返しスラッシュします。
  • ヒープ割り当ての主なパフォーマンスへの影響は、累積的な問題である割り当て時間ではなく、断片化です。蓄積が少ない。

  • いくつかの病理学的症例があります。チャンクの割り当て解除と割り当てに「またがる」短期間の割り当てアクティビティが多数ある場合(たとえば、別のスレッドで同じルーチンを実行する場合)、ヒープマネージャーに大きなチャンク用の新しいメモリを要求するように頻繁にプッシュする可能性があります(現在は占有)。これにより、キャッシュが実際に断片化され、ワー​​キングセットが増加します。

したがって、直接測定できる直接的なヒットがあります。/コストはどれくらいnewですdeletedo_something()?高価な場合do_somethingは、あまり測定しない可能性があります。

そして、大規模なアプリケーションで蓄積される「ヒープ圧力」があります。それへの貢献を測定することは困難であり、事後に特定するのが難しい、12人の独立した貢献者によって構築されたパフォーマンスのレンガの壁にぶつかる可能性があります。

于 2010-08-05T06:42:07.813 に答える
2

ヒットがどれくらい大きいかをテストしない限り、実際にはわかりませんが、ループ内に割り当てる理由がない場合は、割り当てないでください。多くのメモリを割り当てると遅くなる可能性があり、十分に割り当てるとコードが遅くなります。
ループ内のすべてについて同じことが言えます。そこにある必要がない場合は、取り出された方が速く実行されます(どれだけ速くなるかは、それが何であるかに完全に依存し、メモリの割り当ては他のことよりも要求が厳しいです)が、コードをより良く/より簡単にする場合は、そうすることができますループに残す価値があります。

于 2010-08-05T05:39:44.823 に答える
0

操作をループから外すと、パフォーマンスが向上します。iter_count特に大きい場合は、外部への割り当てが速くなります。

new()オペレーターは潜在的に(常にではありませんが!)オペレーティングシステムコールにより多くのメモリを取得させますが、これは(比較的言えば)コストがかかります。同様に、このdelete()呼び出しはメモリを解放する可能性があり(常にではありません!)、オペレーティングシステムコールも引き起こします。

すべての場合do_something()において、それが初期化されておらず、ランダムなデータを含むことができるメモリの内容についての仮定を行わないことを確認してください。

于 2010-08-05T05:54:55.047 に答える
0

オーバーヘッドは、do_something() の「重み」に依存します。配列に作用するので、いくつかのスカラー操作よりも少し多いと思います。したがって、この場合、割り当て/削除をループの外に移動しても、速度が向上することはありません。ただし、上記の場合、そうしない理由はほとんどありません。

于 2010-08-05T05:43:37.680 に答える