0

std::unique_ptr を使用するようにコードを移行しています。

ツリー階層を持つ 1 つのクラスについて決定しなければならなかったとき、ツリーからオブジェクトを削除するとそのオブジェクトが削除されるように、オブジェクトがその子を所有できるようにすることにしました。ただし、何千もの要素の複雑な階層では、それを破壊するのが非常に遅いことに気付きました。のように、信じられないほど遅い。

一意のポインターのベクトルをネストしないことをお勧めします。unique_ptr のフラット レイアウトに切り替えて、通常のポインターをツリーに保持する必要がありますか? これがダメだということはよく知られている事実かもしれないと想像していますが、この特定の詳細に関する文献を見つけるのに苦労したので、私は困惑しています.

#include <vector>
#include <memory>

class Element
{
    std::vector<std::unique_ptr<Element>> mChildren;
};

更新:私の質問を削除するかどうかについて長い間ためらった後、私の問題がこれに非常に似ていることに気付きました: ポインタのSTLベクトルのエントリを削除する高速な方法

さらに、ツリー構造ではプロセスがさらに遅くなります。unique_ptr結局のところ、ここでは責任を負っていないようです。

私はそれを調査するためにコードを書きました

  • 60,000 要素の破棄unique_ptr、フラット レイアウトには約 5 秒かかります

  • 60,000 個の要素を破壊するunique_ptr、ツリー レイアウトには約 8 秒かかります

unique_ptr を使用しない場合、時間はわずかに短くなります。

したがって、私が直面している実際の問題は、60 000 個のものを連続して削除するのが遅いということです。次に、私の解決策は、リンクされた質問のものと似ていると思います:

  • バッチで削除することがわかっている要素のメモリをプールしますが、非常に面倒で重大なエラーが発生しやすいと言われています

  • ワーカー スレッドに実行させます。つまり、低速のままですが、メイン スレッドを妨げません。

私は両方を適切に実行する方法について技術的に精通していませんが、それは私を教育すると思います.

4

0 に答える 0