Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
sync/v2 プロポーザルの 背景と sync.Pool について
Search
matumoto
May 15, 2025
Technology
770
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
sync/v2 プロポーザルの 背景と sync.Pool について
DMM.go #10 での登壇資料です
-
https://dmm.connpass.com/event/346087/
matumoto
May 15, 2025
More Decks by matumoto
See All by matumoto
Go標準パッケージのI/O処理をながめる
matumoto
0
420
testingを眺める
matumoto
1
210
Goトランザクション処理
matumoto
1
83
いまいちどスライスの 挙動を見直してみる
matumoto
0
410
Go1.22のリリース予定の機能を見る
matumoto
0
87
GoのUnderlying typeについて
matumoto
0
230
Typed-nilについて
matumoto
0
380
GoのType Setsという概念
matumoto
0
54
GoのRateLimit処理の実装
matumoto
0
490
Other Decks in Technology
See All in Technology
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
280
ザ・データベース、MySQL ~ OSC 2026 Sendai ~
sakaik
0
140
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
310
PostgreSQL 19 新機能概要 OSC Hokkaido 2026
nori_shinoda
0
150
手塩にかけりゃいいってもんじゃない
ming_ayami
0
610
AIチャット検索改善の3週間
kworkdev
PRO
2
140
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
180
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
300
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
0
210
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
160
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
240
Featured
See All Featured
Visualization
eitanlees
152
17k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Documentation Writing (for coders)
carmenintech
77
5.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
How to train your dragon (web standard)
notwaldorf
97
6.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Amusing Abliteration
ianozsvald
1
210
AI: The stuff that nobody shows you
jnunemaker
PRO
8
720
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
66
55k
Automating Front-end Workflow
addyosmani
1370
210k
Transcript
© DMM © DMM CONFIDENTIAL sync/v2 プロポーザルの 背景と sync.Pool について
DMM.go #10 24新卒 松本響輝(matumoto) 2025-05-15
© DMM 2 松本 響輝 (matumoto) • 合同会社DMM.com 開発統括本部マーケティングテクノロジー 部開発チーム
• Goがちょっと好きな24新卒です • X: @matumoto_1234
© DMM 発表の目的 • sync/v2 についてちょっと詳しくなる • 今後注目される機能に目を向ける足がかりになれれば! • 追加される機能の背景や議論を知ってもっとGoを好きに!
• Approveされていない のであくまで参考程度に 3
© DMM 目次 • v2のプロポーザル一覧 • syncパッケージ(v1)のおさらい • インターフェースのメモリ割り当てについて •
sync/v2パッケージのプロポーザル • ジェネリクス対応とv2 • まとめ 4
© DMM CONFIDENTAL v2のプロポーザル一覧
© DMM 6 label:v2 かつ label:Proposal なものは32件もある
© DMM 7 今回、sync/v2 について紹介
© DMM CONFIDENTAL そのまえに
© DMM CONFIDENTAL syncパッケージ (v1)のおさらい
© DMM Go1.24までの sync パッケージの機能 • 代表的なもの ◦ sync.Pool ◦
sync.Map ◦ sync.WaitGroup ◦ sync.Mutex ◦ … 10
© DMM それぞれの概要 • 代表的なもの ◦ sync.Pool → スレッドセーフなキャッシュ(GCの負荷を軽減) ◦
sync.Map → スレッドセーフなmap ◦ sync.WaitGroup → goroutine の待機に ◦ sync.Mutex → 排他制御に ◦ … 11
© DMM 今回 sync.Pool と sync.Map に注目 • 代表的なもの ◦
sync.Pool → スレッドセーフなキャッシュ(GCの負荷を軽減) ◦ sync.Map → スレッドセーフなmap ◦ sync.WaitGroup → goroutine の待機に ◦ sync.Mutex → 排他制御に ◦ … 12
© DMM sync.Pool 型 13
© DMM sync.Pool 型 14 any を返す関数を渡す
© DMM sync.Map 型 15
© DMM sync.Map 型 16
© DMM sync.Map 型 17 メソッドでは基本 any を扱う
© DMM any で扱うことのなにが問題か? 18 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう
© DMM any で扱うことのなにが問題か? 19 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう
© DMM any で扱うことのなにが問題か? 20 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)
では any で扱ってしまっている ...
© DMM any で扱うことのなにが問題か? 21 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)
では any で扱ってしまっている ... インターフェースを介さないジェネリクスで扱い たい!
© DMM CONFIDENTAL インターフェースを 介したくない理由って ...?🤔
© DMM CONFIDENTAL インターフェースの メモリ割り当てについて
© DMM インターフェースのメモリ割り当て(雑) 24 • インターフェースは「型」と「値」を持っている • 「型」はメソッド情報へのポインタ • 「値」は実際のデータへのポインタ
(他の言語でのボックス化に近い概念かもしれません)
© DMM インターフェースのメモリ割り当て(雑) 25 String() メソッドを持つ構造体 A
© DMM インターフェースのメモリ割り当て(雑) 26 fmt.Stringer として新しく変数を作る
© DMM インターフェースのメモリ割り当て(雑) 27 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 fmt.Stringer a.String()
© DMM インターフェースのメモリ割り当て(雑) 28 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 fmt.Stringer 値へのポインタはヒー プ領域に確保 a.String()
© DMM インターフェースのメモリ割り当て(雑) 29 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 a.String() 値へのポインタはヒー プ領域に確保 ポインタ分のヒープ領域への 割り当てが発生する!
© DMM インターフェースのメモリ割り当て(雑) 30 s := fmt.Stringer(a) 型へのポインタ 値へのポインタ a.str
などの値 a.String() 値へのポインタはヒー プ領域に確保 最適化で割り当てが 発生しない場合もあります
© DMM 最適化. 割り当てが発生しないこともある 31 ※ ワードサイズ: 32bit や 64bit
などのCPUの処理単位
© DMM 最適化. 割り当てが発生しないこともある 32 i := any(v) 型へのポインタ 値へのポインタ
100 any
© DMM 最適化. 割り当てが発生しないこともある 33 i := any(v) 型へのポインタ 値へのポインタ
100 any 値をここに入れた方が 効率的!
© DMM 最適化. 割り当てが発生しないこともある 34 i := any(v) 型へのポインタ 100
any ポインタのヒープ 割り当てがなくなる
© DMM つまり..? 35 • インターフェースを介すと、メモリ割り当てが発生! ◦ (大体のケースで) • 1回は小さくても頻繁に行われるなら大きく響くかも..?
© DMM CONFIDENTAL sync.Pool, sync.Map に話をもどして ...
© DMM any で扱うことのなにが問題か?(再掲) 37 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう
© DMM any で扱うことのなにが問題か?(再掲) 38 • メモリ割り当てが行われる • 返り値の型アサーションがめんどう sync(v1)
では any で扱ってしまっている ... インターフェースを介さないジェネリクスで扱い たい!
© DMM CONFIDENTAL sync/v2 パッケージのプロポーザル
© DMM 提案の概要 • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク
ス) • それ以外は据え置き 40
© DMM sync.Pool のジェネリクス対応 41
© DMM sync.Map のジェネリクス対応 42
© DMM 提案の内容(再掲) • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク
ス) • それ以外は据え置き 43
© DMM 提案の内容(再掲) • sync.Pool, sync.Map をジェネリクス対応 • (sync.NewPool() があるのでただの移行ではないが、主題はジェネリク
ス) • それ以外は据え置き 44 ジェネリクス対応のためだけに v2 にするのか という意見もある
© DMM 議論の一部要約 45 ジェネリクス対応のためだけに v2にするべきか? 今後 sync/v3, net/http/v10, …
のように 乱立してしまうのでは? ジェネリクスほどの大きな変更で はじめて sync/v3 になるので乱立しない
© DMM CONFIDENTAL ジェネリクス対応と v2
© DMM ジェネリクス対応とv2 • 2021年頃から sync/v2 とは別で議論がされている 47
© DMM 検討案 48 2. XxxOf 接尾辞 3. 型パラメータ デフォルト値
1. v2パッケージ をつくる
© DMM 案1. v2パッケージをつくる • まさしく sync/v2 のようにバージョンを分ける 49
© DMM 案1. v2パッケージをつくる • まさしく sync/v2 のようにバージョンを分ける 50 sync/v3,
net/http/v10, ... のように乱立しそう
© DMM 案2. XxxOf 接尾辞 • PoolOf[T], MinOf[T] • XxxOf
でジェネリクスとする • 元々ジェネリクスなものはそのまま Tree[K, V] 51
© DMM 案2. XxxOf 接尾辞 • PoolOf[T], MinOf[T] • XxxOf
でジェネリクスとする • 元々ジェネリクスなものはそのまま Tree[K, V] 52 混乱しやすい
© DMM 案3. 型パラメータにデフォルト値 • ジェネリクス構文を拡張して互換性を保つ 53
© DMM 案3. 型パラメータにデフォルト値 • ジェネリクス構文を拡張して互換性を保つ 54 直感的でない
© DMM ジェネリクス対応とv2 • 結論は出ず... • sync/v2 パッケージでも同様の議論が生まれている • 差別化のために
x/sync の Cond をいれてみてはという意 見も 55
© DMM CONFIDENTAL 感想とまとめ
© DMM 感想とまとめ • いろんな v2 パッケージのプロポーザルがある! • sync.Pool と
sync.Map がジェネリクス対応するかも? • sync/v2 は今後のジェネリクス対応にも関わってきそうなので期 待 57
© DMM 参考 • https://github.com/golang/go/issues/71076 • https://research.swtch.com/interfaces • https://github.com/dominikh/go-tools/issues/302 •
https://go-review.googlesource.com/c/go/+/24371?tab=comments • メモリアドレス - Wikipedia 58
© DMM ご清聴ありがとうございました!