1

データを行列 (配列の配列) に格納するセル オートマトン プログラムを作成しました。300*200 行列の場合、静的メモリ割り当て (例) を使用して、1 秒あたり 60 回以上の反復を実現できますstd::array

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

私はどちらかできるかどうか疑問に思っています

a)メモリを一度割り当ててから、通常の静的配列のパフォーマンスのために何らかの方法で「フリーズ」しますか?

b) またはより効率的な操作を実行しstd::vectorますか? 参考までに、私はマトリックスでのみ操作を行っmatrix[x][y] == 1ています。matrix[x][y] = 1

この質問/回答によると、std::vectorポインターを使用する場合と使用する場合のパフォーマンスに違いはありません。

編集:

UmNyobe の提案に従って、マトリックスを書き直して、 経由でアクセスする単一の配列にしmatrix[y*size_x + x]ました。動的メモリ割り当て (起動時に 1 回サイズ変更) を使用して、パフォーマンスを 2 倍にして 1 秒あたり 5 回の反復にしました。

PaulMcKenzie のコメントによると、リリース ビルドをコンパイルしたところ、求めていたパフォーマンス (1 秒あたり 60 回以上の反復) が得られました。ただし、これはより多くの基盤であるため、ある方法の利点を他の方法よりも徹底的に定量化したいので、 a を使用しstd::chrono::high_resolution_clockて各反復の時間を測定し、動的配列と静的配列のパフォーマンスの違いを発見しました (を使用した後)単一の配列行列表現) が誤差の範囲内に収まるようにします (反復あたり 450 ~ 600 マイクロ秒)。

ただし、デバッグ時のパフォーマンスが少し気になるので、両方とも残しておき、デバッグ時は静的配列に切り替えようと思います。

4

1 に答える 1