2011-08-02 2 views
2

スタートアップ時に〜1GBのRAMが必要なプログラムを作成しましたが、これはコールドスタートから組み合わされた残りのプログラムよりも時間がかかります。 (これは単純なプログラムで、後続の実行にはほとんど時間がかかりません)。タスクマネージャーで監視するとRAMはほとんどなく、必要な1GBに達するまで約2MB /秒ずつ増加します。私はオプション「ヒープリザーブサイズ」と「ヒープコミットサイズ」を見つけて1000000000に設定しましたが、タスクマネージャーを使ってプログラムを見たとき、プログラムは1GBで開始し、その後2MB /秒で成長しますbad_allocを取得します。問題の行は次のとおりです。 std::vector<std::vector<char> > data(512, std::vector<byte>(2097252, 0));
これらのオプションが何であるかを明確に説明できる人がいれば、割り当てを高速化する方法があるでしょうか?私はhttp://msdn.microsoft.com/en-us/library/f90ybzkh(v=vs.80).aspxを読んだが、それは私が観察した動作を説明していない。MSVCヒープリザーブ/コミット

+1

ヒープが間違っています。これはプロセスヒープであり、CRTヒープではありません。あなたのページファイルのようなサウンドは、古いXPマシンでは一般的なものではありません。 SysInternalsのPageDefragユーティリティを確認してください。 –

+0

私は自分の質問に7時間以上答えられませんが、最初の実行でRAMからハードドライブへのページングが行われなければならないことに気付きました。後続の実行では、 。割り当て/ゼロ設定はそれとは関係ありません。申し訳ありません。 –

答えて

1

おそらく、最初の実行でRAMからハードドライブにページングする必要があるのに対し、後続の実行では最初の実行後に残っているすべての未使用のRAMがあるためです。割り当て/ゼロ設定はそれとは関係ありません。申し訳ありません。

3

メモリの割り当てによってスピードの問題が発生していません。あなたのスピードの問題は〜2MBのゼロを512回コピーすることによって引き起こされています。それらのプロパティを変更することはあなたを助けるつもりはありません。

std::vectorに依存するのではなく、メモリをゼロにする効率的な方法を調べます。少なくとも、2MBのデータのstd :: vectorをコンストラクタの引数として渡さないでください。デフォルトのコンストラクタで空のベクトルを512個作成し、それぞれを2 MBにリサイズします。少なくともそれはメモリコピーではありません。ほんの一束のメモリが書いている。

+0

私はあなたが言うように、メモリをゼロにするより効率的な方法を調べますが、その後の実行では操作がほぼ瞬時に行われるため、これが問題であると私は疑うようです。私は家に帰るときにそれを覚えようとします。 –

+0

割り当てがチョークポイントではないことを指摘してくれてありがとう。あなたはそれを理解するために正しい道を私に教えてくれました。 –

関連する問題