データを行列(配列の配列)に格納するセルオートマトンプログラムを書きました。 300 * 200マトリックスの場合、静的メモリ割り当て(例えば、std::array
)を使用して、毎秒60回以上の反復を達成することができます。C++ - 起動時に可変サイズの静的配列のパフォーマンス
私はプログラムを毎回再コンパイルすることなく、異なるサイズの行列を生成したい、すなわちユーザがサイズを入力し、そのマトリクス・サイズのシミュレーションが始まります。しかし、動的メモリ割り当て(たとえばstd::vector
)を使用すると、シミュレーションは1秒あたり〜2回の繰り返しに低下します。どうすればこの問題を解決できますか?私が頼りにした選択肢の1つは、ユーザーが選択すると予想されるよりも大きな静的配列(たとえば2000 * 2000)を事前に割り当てることですが、これは無駄に見えますが、ユーザーの選択肢はある程度制限されています。私はどちらか
a)は通常の静的配列のパフォーマンスのために、「フリーズ」何とか一回とし、それをメモリを割り当てることができるかどう
私は思ったんだけど?
b)またはstd::vector
上でより効率的な操作を実行しますか?参考のために、私は行列上の演算をmatrix[x][y] == 1
とmatrix[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マイクロ秒)。
デバッグ中のパフォーマンスは、しかしわずかな関心事であるので、私は、私は両方を維持し、デバッグ時に静的な配列に切り替えると思います。参考のため
パフォーマンスの違いは、コンパイラの最適化に関連しているようです(オンにしましたか?)。正確な回答が必要な場合は、コードを入力してください。 – mkk
std :: vector>を使用していますか? –
immibis
[開始サイズ](http://en.cppreference.com/w/cpp/container/vector/vector)でベクトルを構築しようとしましたか?いくつかのコンストラクタを読み上げる必要があります。 –