割り当て解除が遅いのはなぜですか?

私はネット上で答えが見つからない質問があります...

私はこのように宣言されたセットを持っています:

set MySet

私はメルセン・トゥイスターで生成された100万の乱数を挿入しています。ランダム生成と挿入は本当に速く(百万回の数値では約1秒)、割り当て解除は非常に遅い(1分30秒)。

割り当て解除が遅いのはなぜですか?私はセットのためのカスタムデストラクタを使用していません。

6
最適化を有効にしてコンパイルしましたか? -O3
追加された 著者 Martin York,
リリースモードでビルドします(ほとんどのものを有効にしてから再起動する必要があります)。
追加された 著者 Martin York,
@シービーン:新しい時は何だったの?
追加された 著者 Martin York,
私はあなたが使用しているOpSysが何であるかわかりませんが、各チャンクが解放された後にメモリが再圧縮されている可能性があります。
追加された 著者 Steve Wellens,
Windows 7x64。 Visual Studio 2010でコンパイルします。割り当て解除を高速化する方法はありますか?
追加された 著者 Sibin Grasic,
@LokiAstari - プロパティ - > C/C ++ - >最適化???もしそうなら、すべてオフになります。
追加された 著者 Sibin Grasic,
@twsaef Mersenne Twisterを使って乱数を生成してセットに挿入します。私の数は2 ^ 16以上です
追加された 著者 Sibin Grasic,
@ LokiAstari - それは働いた! :Dあなたはそれを回答として投稿できますか?
追加された 著者 Sibin Grasic,
5秒。返事が遅くなってごめん。あなたのコメントを見ました
追加された 著者 Sibin Grasic,
g ++またはVS2010で問題を再現できませんでした。 codepad.org/KQj7Yfq4
追加された 著者 twsaef,
スピードの問題が発生しているので、それは見逃しても問題ありませんか?
追加された 著者 twsaef,

2 答え

リリースモードでコードをコンパイルします。

これは2つのことを行います。

  1. It turns on the optimizations which definitely help.
  2. Also the memory management libraries are different for debug and release.
    The debug version of the library are built to allow for debugging and they maintain extra information (like marking de-allocated memory). All this extra processing does actually cost
    • The objective of the two version of the library are completely different. The release version is definitely optimized for speed the debug version is optimized for recovery and debugging.

この情報はDevStudioに関するものです。

7
追加された

多くのアプリケーションが割り当てを解除することなく割り当てを行うため、割り振りを犠牲にして割り当てを最適化する方が理にかなっていると思われますが、その逆もありません。私は malloc free (一度にすべての割り当てと割り当てを解除するのではなく)を混在させたアプリケーションで、同様のパターンを自分自身で見ました。

私はヒープアロケータを書いたことがないので、それよりも深い技術的な理由があるかどうかはわかりません。割り振りを解除するときは、隣接する空きブロックを見つけて合体させる必要があります。だから仕事は根本的に違います。

100万の小さな free()の音はかなり遅く90秒です。私は本当にWindowsをプログラムしたことがないので、それが異常かどうかは言えませんが、システムはもっとうまくやれるはずです。

The solution to your problem may be simply to skip freeing the objects before the program exits. You might try deriving a custom allocator from std::allocator< unsigned int > which makes deallocate a no-op.

1
追加された