web-dev-qa-db-ja.com

MemoryPool <T>とArrayPool <T>の違い

MemoryPoolArrayPool の違いは何ですか?私が知る限り、どちらも同じことを行います(ガベージコレクションの圧力を減らすためにバッファーを貸し出します)。

NetworkStream または WebSocket を使用するための読み取り呼び出しで推奨されるプールはありますか?

4
morleyc

ArrayPool<T>クラスはレンタルArraysを貸し出します。つまり、RentメソッドはT[]を返します。 Sharedプロパティは、バケットのTlsOverPerCoreLockedStacksArrayPool配列とローカルのコアごとの組み合わせでバッキング配列をキャッシュするArrayPool<T>ThreadStaticのデフォルト実装を返します「スタック」。 charおよびbyteの場合に最適化されています。 ConfigurableArrayPoolメソッドから返されたCreateは、基になる配列をBucketsの配列に格納します(それぞれに独自の配列の配列があります)。さらに、独自の実装を作成することもできます。

一方、MemoryPool<T>は、最終的にはMemory<T>オブジェクトを処理するという点で、もう少し汎用的です。 RentメソッドはIMemoryOwner<T>の実装を配布します。これはowning a Memory<T>を担当します。メモリオーナーは、さまざまなソースによってサポートされ、アレイはその1つです。 MemoryPool<T>.Sharedシングルトンは実際にはArrayMemoryPool<T>であり、これはArrayPool<T>.Sharedによってサポートされています。ただし、メモリプールは、たとえばSafeHandleが指すアンマネージメモリ/メモリなど、さまざまなソースによってサポートされている場合があります。

どちらを使用するかは、実際には要件によって異なります。

  • 使用しているAPIがT[]を必要とする場合、または単に割り当てなしの配列が必要な場合は、ArrayPool<T>が使用したいものです。

  • Memory<T>インスタンスを使用している場合は、MemoryPool<T>を使用します

どちらかを使用できるAPIを使用している場合、プールを使用することで他のプールを使用することには必ずしも利点はありません。 API自体はT[]を使用するよりもraw Memory<T>を使用した方がうまくいく場合があります(またはその逆)。ただし、APIはメモリ自体にのみ注意を払う必要があり、取得元のプールを認識していません。

3
pinkfloydx33