何千もの小さなオブジェクト (500,000 以上) を作成するアプリケーションがあります。これらのオブジェクトをヒープに割り当てるオブジェクト ファクトリがあります。
私が直面している問題は、これらの小さなオブジェクトを保持するオブジェクトが範囲外 (ドライバー) になると、処理時間の 65% がこれらの小さなオブジェクトの破棄に費やされることです。
map
、entries
、およびfields
は抽象基本クラスへのポインターを保持し、各基本クラスには多くの子クラスがあります。
アプリケーション アーキテクチャは次の形式に従います。
class Driver {
boost::ptr_map<std::string, Class1-Base> map;
}
class Class1-Base {
boost::ptr_vector<Class2-Base> entries;
}
class Class2-Base {
boost::ptr_vector<Class3-Base> fields;
}
class Class3-Base {
unsigned long value;
}
アプリケーションのパフォーマンスを向上させるために、いくつかの方法を試しました。
最初に通常のポインタを持つデータ構造を使用し、次にクラスのデストラクタでオブジェクトを明示的に削除しました。
次に、データ構造を使用してみましboost::shared_ptr<>
たが、参照カウントがかなりのオーバーヘッドを引き起こし、大きなメリットはないと判断しました。
私が今たどり着いた解決策boost::ptr_container
は、ヒープオブジェクトの所有権を取得し、コンテナが範囲外になると自動的にそれらを破棄することです。このソリューションでは、オブジェクトの破棄にかなりの時間が費やされます。
この間ずっとオブジェクトを破壊するのを防ぐためにできることはありますか?