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
0
650
sync/v2 プロポーザルの 背景と sync.Pool について
DMM.go #10 での登壇資料です
-
https://dmm.connpass.com/event/346087/
matumoto
May 15, 2025
Tweet
Share
More Decks by matumoto
See All by matumoto
testingを眺める
matumoto
1
180
Goトランザクション処理
matumoto
1
71
いまいちどスライスの 挙動を見直してみる
matumoto
0
380
Go1.22のリリース予定の機能を見る
matumoto
0
77
GoのUnderlying typeについて
matumoto
0
220
Typed-nilについて
matumoto
0
350
GoのType Setsという概念
matumoto
0
40
GoのRateLimit処理の実装
matumoto
0
460
Webプッシュ通知触ってみた
matumoto
0
39
Other Decks in Technology
See All in Technology
類似画像検索モデルの開発ノウハウ
lycorptech_jp
PRO
3
900
型を書かないRuby開発への挑戦
riseshia
0
180
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
7
7.1k
Secure Boot 2026 - Aggiornamento dei certificati UEFI e piano di adozione in azienda
memiug
0
140
生成AIの利用とセキュリティ /gen-ai-and-security
mizutani
1
1.2k
JAWS DAYS 2026 CDP道場 事前説明会 / JAWS DAYS 2026 CDP Dojo briefing document
naospon
0
140
生成AI活用によるPRレビュー改善の歩み
lycorptech_jp
PRO
5
2k
ソフトウェアアーキテクトのための意思決定術: Create Decision Readiness—The Real Skill Behind Architectural Decision
snoozer05
PRO
30
9k
Ultra Ethernet (UEC) v1.0 仕様概説
markunet
3
200
Claude Cowork Plugins を読む - Skills駆動型業務エージェント設計の実像と構造
knishioka
0
260
越境する組織づくり ─ 多様性を前提にしたチームビルディングとリードの実践知
kido_engineer
1
110
20260305_【白金鉱業】分析者が地理情報を武器にするための軽量なアドホック分析環境
yucho147
1
170
Featured
See All Featured
Color Theory Basics | Prateek | Gurzu
gurzu
0
230
Accessibility Awareness
sabderemane
0
73
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
84
Statistics for Hackers
jakevdp
799
230k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
60
51k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
How to build a perfect <img>
jonoalderson
1
5.2k
Abbi's Birthday
coloredviolet
2
5.1k
Context Engineering - Making Every Token Count
addyosmani
9
740
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
120
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 ご清聴ありがとうございました!