コードは次のようになります。
for (int i = 0; i <= LARGE_NUMBER; ++i) {
int x[LARGE_NUMBER] = {0};
// do something with x
}
を通過x
するたびに配列が作成されると思うので、パフォーマンスが低下しますか? いくつかの助けになりますか?for-loop
0~LARGE_NUMBER
-O2
コードは次のようになります。
for (int i = 0; i <= LARGE_NUMBER; ++i) {
int x[LARGE_NUMBER] = {0};
// do something with x
}
を通過x
するたびに配列が作成されると思うので、パフォーマンスが低下しますか? いくつかの助けになりますか?for-loop
0~LARGE_NUMBER
-O2
アプリケーションによって異なります...配列サイズが固定されていると思いますか?使用します: http://www.cplusplus.com/reference/cstring/memset/
#include <stdio.h>
#include <string.h>
int* x = new int[LARGE_NUMBER];
for (int i = 0; i <= LARGE_NUMBER; ++i) {
memset(x,0,LARGE_NUMBER);
// do something with x
}
//some more stuff that needs x
delete[] x;
ところで: コードをテストするための C/C++ は手元にありません。
配列は各反復でゼロになるため、間違いなくゼロになります。
このコードは線形時間であり、配列のすべての要素がゼロで初期化されます。
int x[LARGE_NUMBER] = {0};
そして、これは定数時間であり、スタック ポインターのインクリメントのみです。
int x[LARGE_NUMBER];
パフォーマンスは、LARGE_NUMBER が本当に大きいかどうかによって異なります。LARGE_NUMBER が 1 つまたは 2 つのキャッシュ ラインのサイズである場合、最初のバージョンと 2 番目のバージョンの違いに気付かないでしょう。しかし、LARGE_NUMBER が本当に大きい場合は、そうなります。ただし、配列が大きすぎてパフォーマンスの違いが目立たない場合は、間違いなくヒープに移動する必要があります。スタック領域は高価であり、そこにメガバイトのデータを割り当てるのは間違っています。
配列が非常に大きい場合は、一度ヒープに割り当てて、memset
反復の間に呼び出すことができます。
LARGE_NUMBER はどのようになると予想されますか?
幅の広いオブジェクトのオンスタック割り当ては、システムがスレッドに与えることができるスタック領域よりも広くなる可能性があることを考慮してください。おそらく、パフォーマンスが開始する前であっても、「メモリ不足」の問題に直面している可能性があります。(スタックは高速である必要があるため、数メガバイト以下である必要があります。理想的には、プロセッサのキャッシュに適合する必要があります)
その場合は、std::vector (スタックに残りますが、ヒープからの割り当てを管理します) の方が適切に機能します。
ただし、内部で定義すると、反復ごとに作成/破棄されます。今:それらの作成/破壊は理にかなっていますか(つまり、毎回繰り返されることが理にかなっているアクションを実行しますか)、それともあなたの問題は、反復ごとにゼロに初期化することだけですか?その場合、私はおそらく次のようなことをします:
{ //just begin a scope block
std::vector<int> v(LARGE_NUMBER); //allocates LARGE_NUMBER int-s on heap
for (int i = 0; i <= LARGE_NUMBER; ++i)
{
std::fill(v.begin(), v.end(), 0); //reset at every iteration
// other stuff with v
}
} //here the vector and associated memory is finally eliminated
std:fill のパフォーマンスは配列の初期化と同様に線形ですが、サイクルごとに割り当て/割り当て解除する方法を避けることに注意してください。
いずれにせよ、あなたの問題は、定義上、O 2の複雑さを持っています。