現時点では、私はSTLベクトルコンテナテンプレートを使用して接続を取り、接続を取得します。プールコンテナの最適なデータ構造は何ですか?
1)取得すると、接続が返され、プールベクターから "erase()"が返されます。
2)リリースでは、接続は "push_back()"を介してプールに戻されます。
プールが頻繁に使用される場合、これは非常に重いことがあります。だから私の質問は、ここに他のデータ構造に切り替えることでパフォーマンスを向上させる方法はありますか?
現時点では、私はSTLベクトルコンテナテンプレートを使用して接続を取り、接続を取得します。プールコンテナの最適なデータ構造は何ですか?
1)取得すると、接続が返され、プールベクターから "erase()"が返されます。
2)リリースでは、接続は "push_back()"を介してプールに戻されます。
プールが頻繁に使用される場合、これは非常に重いことがあります。だから私の質問は、ここに他のデータ構造に切り替えることでパフォーマンスを向上させる方法はありますか?
vector
は問題ありません。deque
を使用してください。list
を使用してください。set
のいずれかの方法があります。いずれにしても、のプロファイルのパフォーマンスが必要です。メインコンテナのtypedefを使用して、異なるオプションを素早く切り替えてテストすることができます。
あなたは私たちに言っていないが、コンテナの選択のために重要である他の要件があるかもしれません:
事前に可能な最大接続数を知っている場合は、ベクトルを保持してください(vector :: reserveを参照)。
それ以外の場合はstd :: listを使用します。
最終的には、使用しているプラットフォームとコンパイラのバージョンとlibstdC++のバージョンによっても異なります。
'std :: list'はすべての挿入物の割り当てを意味します。これは 'std :: vector'より高速ではありません。 –
はおそらくプールに最適なコンテナです。 O(1)を挿入する必要があり、注文を保守する必要がない場合はO(1)を削除することもできます。アイテムを削除して最後のアイテムを交換し、ベクトルを縮小することができます。またstd::vector
は、他のコンテナに比べてかなりスペース効率が良いです。メモリ消費量が少ないということは、より多くのCPUキャッシュヒットがあるため、より良いパフォーマンスを意味します。
ボトルネックはほとんどないと思われますので、プロファイリングは無作為に最適化するよりも優れています。 – Simone
確かなこと - プロファイリング。コンテナを使った正しいアプローチだと思っています。 – Myz