1

データを行列(配列の配列)に格納するセルオートマトンプログラムを書きました。 300 * 200マトリックスの場合、静的メモリ割り当て(例えば、std::array)を使用して、毎秒60回以上の反復を達成することができます。C++ - 起動時に可変サイズの静的配列のパフォーマンス

私はプログラムを毎回再コンパイルすることなく、異なるサイズの行列を生成したい、すなわちユーザがサイズを入力し、そのマトリクス・サイズのシミュレーションが始まります。しかし、動的メモリ割り当て(たとえばstd::vector)を使用すると、シミュレーションは1秒あたり〜2回の繰り返しに低下します。どうすればこの問題を解決できますか?私が頼りにした選択肢の1つは、ユーザーが選択すると予想されるよりも大きな静的配列(たとえば2000 * 2000)を事前に割り当てることですが、これは無駄に見えますが、ユーザーの選択肢はある程度制限されています。私はどちらか

a)は通常の静的配列のパフォーマンスのために、「フリーズ」何とか一回とし、それをメモリを割り当てることができるかどう

私は思ったんだけど?

b)またはstd::vector上でより効率的な操作を実行しますか?参考のために、私は行列上の演算をmatrix[x][y] == 1matrix[x][y] = 1と実行しています。

this question/answerによれば、std::vectorとポインターを使用してもパフォーマンスに違いはありません。

EDIT:

Iはmatrix[y*size_x + x]介してアクセス単一のアレイであることが、UmNyobe」提案に従って、マトリクスを書き換えてきました。動的メモリ割り当て(起動時に一度のサイズ)を使用して、パフォーマンスを1秒あたり5回の繰り返しに倍増します。 PaulMcKenzieさんのコメントを1として

、私はリリースビルドをコンパイルし、私が探していたパフォーマンス(毎秒60回以上の反復)を得ました。しかし、これはもっと基盤であるため、ある方法の利点をもう少し徹底的に定量化したいので、私はstd::chrono::high_resolution_clockを使って各繰り返しの時間を計り、動的配列と静的配列のパフォーマンスの差が単一のアレイマトリックス表現)がエラーの範囲内にある(反復ごとに450〜600マイクロ秒)。

デバッグ中のパフォーマンスは、しかしわずかな関心事であるので、私は、私は両方を維持し、デバッグ時に静的な配列に切り替えると思います。参考のため

+0

パフォーマンスの違いは、コンパイラの最適化に関連しているようです(オンにしましたか?)。正確な回答が必要な場合は、コードを入力してください。 – mkk

+1

std :: vector >を使用していますか? – immibis

+0

[開始サイズ](http://en.cppreference.com/w/cpp/container/vector/vector)でベクトルを構築しようとしましたか?いくつかのコンストラクタを読み上げる必要があります。 –

答えて

2

、私はレッドフラッグ

matrix[x][y] 
  • を行っております! のマトリックスにvector<vector<int>>を使用していますか?これは間違いです。行列の行はメモリ内で離れて になります。あなたは、サイズrows x cols の単一のベクターを使用し、さらに、matrix[y * row + x]
  • を使用するには、最初の行によると、その後の列によって、すなわちmatrix[y][x]むしろmatrix[x][y]よりもあなたのインデックスのアプローチに従うべきである必要があります。あなたのアルゴリズムも同じように処理する必要があります。これは、任意の他の機構要素(x,y)(x + 1, y)と、(x, y + 1)ははるかに遠く離れている間matrix[y][x](x、y)と(X + 1、Y)で互いに1つのメモリブロックであるという事実です。

std :: arrayからstd :: vectorへのパフォーマンスの低下があっても(配列がスタック上の要素を持つことができるため、高速です)、まともなアルゴリズムは両方を使って同じ大きさで実行しますコレクション。

関連する問題