プロファイリングを行った後、アプリケーション内の特定のオブジェクトは、オブジェクト プールを作成する代わりに使用することで大きなメリットがあることがわかりました。このアプリケーションは、複数のスレッドを持つプロデューサー/コンシューマー キューに基づいています。
ConcurrentBag コレクションは基本的に ObjectPool であり、アプリケーションのオブジェクト プールのバッキング ストアとして最適なようです。私が正しく理解していれば、ConcurrentBag は概念的に次のように機能します。
- バギングされたオブジェクトの ThreadLocal コレクションを保持します。挿入する場合はこのコレクションに追加し、削除する場合はこのコレクションから削除します。
- ローカル コレクションに要素がなく、オブジェクトを削除する必要がある場合は、別のスレッドのローカル コレクションから 1 つ盗みます。
問題は、アプリケーションが常にスレッド 'A' でオブジェクトを要求し、常にスレッド 'B' でそれを返すことを既に知っていることです。したがって、常にスチール ケースがデフォルトになります。
このアクセス パターンを知っている場合、フレームワークによって提供される別のコレクションを使用してオブジェクト プールをバックアップする方がよいでしょうか?