MemoryPool と ArrayPool の違いは何ですか?私が知る限り、どちらも同じことを行います(ガベージコレクションの圧力を減らすためにバッファーを貸し出します)。
NetworkStream
または WebSocket
を使用するための読み取り呼び出しで推奨されるプールはありますか?
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はメモリ自体にのみ注意を払う必要があり、取得元のプールを認識していません。