問題タブ [boost-pool]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
boost - 指定された要素サイズと指定された初期要素数でプールをブーストしますか?
boost::pool<> コンストラクターは「要素サイズ」パラメーターを取ります。
boost::object_pool コンストラクターは、「要素の初期数」パラメーターを取ります。
「要素サイズS」「要素の頭文字N」でプールを作成したい。
これは boost::pool で可能ですか?
ありがとうございました
c++ - Boost Pool Library: 作成したオブジェクトを再利用するには?
したがって、プログラムの開始時に、3 つのコスチューム データ要素 (char の構造体とその長さなど) にバッファ配列を作成したいと考えています。3 つの要素すべてが使用された後、2 番目の要素などよりも最初にアプリから渡したいと思います。Boost Pool Libraryでそれは可能ですか?また、そのようなことを正確に行う方法は?
c++ - このような場合、スタックとヒープとブースト::プールの割り当てを決定する方法は?
次のように、boost::variantを使用してdoubleまたはstringを格納するクラスがあります。
これは、私が遊んでいるおもちゃのインタプリタにとっては不変の値型であると考えられています。最初は、const参照で渡し、値で返すことをお勧めします。プリミティブとして扱いたいので、常にスタックに割り当てます。しかし、サイズが40バイトであることがわかり(ほとんどの場合、sizeof std :: stringが原因です)、少し心配でした。スタックに大きなメモリチャンクを割り当てるべきではないことはわかっていますが、大きすぎるのはどれくらいですか?
また、戻るたびに40バイトをコピーすることは、特に値が不変であり、コピーする必要さえないため、少し無駄に思えます。
オプションの通常のヒープ割り当ては、1秒あたり数千のこれらの割り当て/割り当て解除を行うことができるため、あまり魅力的ではないようです。
私が思いついた最後のオプションは、必要に応じてこれらのオブジェクトを割り当てるためにboost :: poolを用意し、それらの存続期間を管理するためにboost::shared_ptrを使用することです。ただし、インタプリタがメモリ割り当てを担当するため(メモリ割り当てのタイプは、テンプレート引数としてインタプリタに渡されるポリシーになります)、これは、値クラスがインタプリタについて知る必要があることを意味し、少し複雑になります。 。
だからこれらは質問です:
- この場合、どうすればよいですか、またその理由は何ですか?
- スタックに割り当てるには「大きすぎる」の大きさはどれくらいですか?それは、割り当てられる頻度とコピーする必要がある頻度にもよると思います。
ありがとう。
boost - calloc に代わるブーストプール
全て、
ブースト プール ライブラリを使用する場合、次のステートメントをどのように置き換えますか。
1 つの要素の場合は、次のようにします。
しかし、「numOfElements」は変数なので、malloc() のループを実行するのは得策ではないのでしょうか?
c++ - Boost::Poolがリンクしない
私はを使用してboost::pool
います。ヘッダーファイルのみがあり、dll、o、またはlibファイルはありません。それらがなくても動作するはずです。
コードをコンパイルすると、次のように表示されます。
どうしてこれなの?問題を引き起こす.libがあってはなりません。
c++ - boost::object_pool コンストラクタの引数の数
ブースト プール ライブラリの boost::object_pool インターフェイスを使用しています。デフォルトでは、boost::object_pool::construct は最大 3 つの引数を取ることができます。オブジェクトの 1 つを作成するには、13 個の引数を渡す必要があります。ここでアドバイスされているように、ファイルdetail/pool_construct.m4で m4 マクロ NumberOfArguments (boost::object_pool::construct に渡すことができる最大引数) を 13 として定義しました。最後に、ファイルは次のようになります
今、次のようなエラーメッセージが表示されます
面白いことに、detail/pool_construct.m4 の変更を元に戻しても修正されず、元のファイルを使用しても、boost::object_pool::construct に引数をいくつも渡すことができません。Visual C++ 2010 Express を使用しています。どんな助けでも大歓迎です。
ありがとう
c++ - boost::singleton_pool でのオブジェクトの作成
boost::singleton_poolを使用して、パフォーマンスが重要なマルチスレッド アプリケーションで「注文」タイプのオブジェクトを多数作成しようとしています。ドキュメントを見ると、これが私がすべきことです。
boost::singleton_pool には、void* のポインターを返す静的メンバー関数 malloc がありますが、コンストラクターを呼び出して OrderPool に Order 型のオブジェクトを作成する必要があります。これを行うには、 boost::pool_allocatorを singleton_pool と一緒に使用しますか?
ありがとう。
c++ - デフォルトより遅いブーストsingleton_poolを使用したカスタム割り当て
MyOrderクラスのカスタム演算子newと演算子deleteを作成しました。boost::singletonプールを使用してメモリを割り当てています。これがパフォーマンスをテストするプログラムです、
-O2フラグを使用して上記のプログラムをコンパイルし、2.26 GHz Intel Core 2 Duoを搭載したMacbookで実行したところ、0.16秒かかりました。次に、カスタム演算子newとoperator deleteを宣言して定義し、-O2フラグを使用して再コンパイルし、同じマシンで実行した行をコメント化し、0.13秒かかりました。
同じサイズのオブジェクトにsingleton_poolを使用してメモリを割り当てたり、割り当てを解除したりすると、メモリが高速化されます。なぜ遅くなるのですか?または、この小さなプログラムで得られるパフォーマンス上の利点を無効にするプールを作成するオーバーヘッドはありますか?
アップデート:
2つのstd::string変数をintとdoubleに置き換え、今回は2つのプログラムを3.0 GHZ AMD Phenom(tm)II X4 945プロセッサでそれぞれ100000000(つまり1000回前)の反復で実行しました。カスタムメモリ割り当てを使用するものは3.2秒かかりますが、デフォルトのメモリ割り当てを使用するものは8.26秒かかります。したがって、今回はカスタムメモリ割り当てが優先されます。
c++ - boost::singleton_pool の使用中に std::string/std::vector メンバー変数を処理する
私は注文するために類似のタイプのオブジェクトを多数作成しているパフォーマンスクリティカルなアプリケーションを書いています。メモリの割り当てにboost::singleton_poolを使用しています。最後に、私のクラスは次のようになります。
最近、 boost::singleton_pool を使用した場合のパフォーマンス上の利点について質問を投稿しました。boost::singleton_poolとデフォルト アロケータのパフォーマンスを比較したところ、パフォーマンス上の利点は得られませんでした。私のクラスに std::string 型のメンバーがあり、その割り当てがカスタム アロケーターによって管理されていないことを誰かが指摘したとき、私は std::string 変数を削除し、テストを再実行しました。今回は、かなりのパフォーマンスの向上に気付きました。
さて、私の実際のアプリケーションでは、時刻 std::string と std::vector のメンバー変数を取り除くことができません。std::string および std::vector メンバー変数でboost::pool_allocatorを使用する必要がありますか?
boost::pool_allocator は、基礎となる std::singleton_pool からメモリを割り当てます。メンバー変数が異なるかどうかは問題になりますか (MyOrder クラスに複数の std::string/std::vector 型があります。また、std::string/std::vector 型を含む MyOrder 以外のクラスにプールを使用しています)メンバーとしても) 同じメモリ プールを使用しますか? もしそうなら、どうすれば彼らがどちらかの方法で行うことを確認できますか?
memory-pool - 可変サイズのバッファのメモリプール使用量(boost :: pool)?
私の現在のプロジェクトのボトルネックはヒープの割り当てです...プロファイリングでは、1つの重要なスレッドがオペレーターと一緒に/オペレーター内で費やす時間の約50%を示していnew
ます。
アプリケーションはここでスタックメモリを使用できず、多くの1つの中央ジョブ構造を割り当てる必要があります。カスタムジョブ/バッファ実装:小さくて短命ですが、サイズは可変です。オブジェクト自体はヒープメモリstd::shared_ptr
/std::weak_ptr
オブジェクトであり、従来のC-Array(char*
)ペイロードを伝送します。
さまざまな部分のランタイム構成とワークロードに応じて、300k〜500kのオブジェクトが作成され、同時に使用される場合があります(ただし、これは通常は発生しないはずです)。x64アプリケーションのメモリの断片化はそれほど大きな問題ではないため(ただし、x86を対象とした場合にも発生する可能性があります)。
速度とパケットスループットを向上させ、将来的にメモリの断片化を防ぐために、メモリ管理プールを使用することを考えていましたboost::pool
。
ほとんどすべての例で固定サイズのオブジェクトを使用しています...しかし、可変長のペイロードを処理する方法がわかりませんか?このような単純化されたオブジェクトは、boost :: poolを使用して作成できますが、ペイロードをどう処理するかわかりませんか?で使え
/li>boost:pool
ますか?通常、shared_ptrへのすべての参照がスコープを使い果たすと、オブジェクトは破棄されます。shared-ptrをc-ptrに戻したくありません。オブジェクトの遅延破棄もパフォーマンスを向上させるために機能するはずであり、私が読んだものから、boost:poolを使用するとよりうまく機能するはずです。プールがsmart_ptrとの相互作用をサポートしているかどうかわかりませんか?別の、しかし風変わりな方法は、プールと一緒に作成時にshared_ptrへの参照を保存し、それらをブロックで解放することです。
誰かが2つの経験がありますか?boost:可変サイズのオブジェクトとスマートポインターの相互作用でのプールの使用?
ありがとうございました!