Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sync/v2 プロポーザルの 背景と sync.Pool について

sync/v2 プロポーザルの 背景と sync.Pool について

DMM.go #10 での登壇資料です

- https://dmm.connpass.com/event/346087/

Avatar for matumoto

matumoto

May 15, 2025
Tweet

More Decks by matumoto

Other Decks in Technology

Transcript

  1. © DMM それぞれの概要 • 代表的なもの ◦ sync.Pool → スレッドセーフなキャッシュ(GCの負荷を軽減) ◦

    sync.Map → スレッドセーフなmap ◦ sync.WaitGroup → goroutine の待機に ◦ sync.Mutex → 排他制御に ◦ … 11
  2. © DMM 今回 sync.Pool と sync.Map に注目 • 代表的なもの ◦

    sync.Pool → スレッドセーフなキャッシュ(GCの負荷を軽減) ◦ sync.Map → スレッドセーフなmap ◦ sync.WaitGroup → goroutine の待機に ◦ sync.Mutex → 排他制御に ◦ … 12
  3. © DMM any で扱うことのなにが問題か? 21 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)

    では any で扱ってしまっている ... インターフェースを介さないジェネリクスで扱い たい!
  4. © DMM インターフェースのメモリ割り当て(雑) 29 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str

    などの値 a.String() 値へのポインタはヒー プ領域に確保 ポインタ分のヒープ領域への 割り当てが発生する!
  5. © DMM インターフェースのメモリ割り当て(雑) 30 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str

    などの値 a.String() 値へのポインタはヒー プ領域に確保 最適化で割り当てが 発生しない場合もあります
  6. © DMM any で扱うことのなにが問題か?(再掲) 38 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)

    では any で扱ってしまっている ... インターフェースを介さないジェネリクスで扱い たい!
  7. © DMM 提案の内容(再掲) • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク

    ス) • それ以外は据え置き 44 ジェネリクス対応のためだけに v2 にするのか という意見もある
  8. © DMM 議論の一部要約 45 ジェネリクス対応のためだけに v2にするべきか? 今後 sync/v3, net/http/v10, …

    のように 乱立してしまうのでは? ジェネリクスほどの大きな変更で はじめて sync/v3 になるので乱立しない
  9. © DMM 案2. XxxOf 接尾辞 • PoolOf[T], MinOf[T] • XxxOf

    でジェネリクスとする • 元々ジェネリクスなものはそのまま Tree[K, V] 51
  10. © DMM 案2. XxxOf 接尾辞 • PoolOf[T], MinOf[T] • XxxOf

    でジェネリクスとする • 元々ジェネリクスなものはそのまま Tree[K, V] 52 混乱しやすい
  11. © DMM 感想とまとめ • いろんな v2 パッケージのプロポーザルがある! • sync.Pool と

    sync.Map がジェネリクス対応するかも? • sync/v2 は今後のジェネリクス対応にも関わってきそうなので期 待 57