sync.Poolは、スレッドセーフなオブジェクトプールで、テンポラリオブジェクトを再利用することでメモリ使用量とガベージコレクションのオーバーヘッドを削減します。
プロセッサコンテキストに関連付けられた複数のローカルプールを維持し、プールからオブジェクトを取得する際に、各プロセッサで実行されているgoroutineのパフォーマンスを最適化します。
オブジェクトがプールから要求された場合、まずそのプロセッサのローカルプールをチェックします。見つかった場合、オブジェクトは再利用されます。そうでない場合、新しいオブジェクトが作成され、ローカルプールに追加されます。
オブジェクトがプールに返却された場合、すぐに再利用されることは保証されず、いつでも削除される可能性があります。
New()関数を使用して、プールが空の場合に新しいオブジェクトを作成できます。指定されていない場合、プールは空の場合にnilを返します。
プールからオブジェクトを取得するには、pool.Get()を使用します。オブジェクトをプールに返却するには、pool.Put()を使用します。
オブジェクトを取得する際に型アサーションを避けるには、専用の関数を作成するか、sync.Poolのジェネリックバージョンを作成します。
プールにオブジェクトへのポインタを格納することで、不要なヒープ割り当てを防ぎ、エスケープ分析を改善できます。
PMGスケジューリングにより、各プロセッサは同時に1つのgoroutineしか実行できず、プールへのアクセスが各プロセッサで実行されているgoroutineのパフォーマンスを最適化します。
sync.Poolは、Goの標準ライブラリで広く使用されており、encoding/jsonやnet/httpなどのI/O操作を最適化し、テンポラリオブジェクトを再利用するために使用されています。
dev.to
Go sync.Pool and the Mechanics Behind It
