Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
530
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
170
Goトランザクション処理
matumoto
1
53
いまいちどスライスの 挙動を見直してみる
matumoto
0
360
Go1.22のリリース予定の機能を見る
matumoto
0
69
GoのUnderlying typeについて
matumoto
0
210
Typed-nilについて
matumoto
0
340
GoのType Setsという概念
matumoto
0
32
GoのRateLimit処理の実装
matumoto
0
420
Webプッシュ通知触ってみた
matumoto
0
36
Other Decks in Technology
See All in Technology
Oracle Cloud Infrastructure:2025年11月度サービス・アップデート
oracle4engineer
PRO
2
160
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
510
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
160
プロダクトマネージャーが押さえておくべき、ソフトウェア資産とAIエージェント投資効果 / pmconf2025
i35_267
2
510
32のキーワードで学ぶ はじめての耐量子暗号(PQC) / Getting Started with Post-Quantum Cryptography in 32 keywords
quiver
0
290
useEffectってなんで非推奨みたいなこと言われてるの?
maguroalternative
10
6.4k
Karate+Database RiderによるAPI自動テスト導入工数をCline+GitLab MCPを使って2割削減を目指す! / 20251206 Kazuki Takahashi
shift_evolve
PRO
1
310
シンプルを極める。アンチパターンなDB設計の本質
facilo_inc
2
1.6k
Docker, Infraestructuras seguras y Hardening
josejuansanchez
0
150
Claude Code はじめてガイド -1時間で学べるAI駆動開発の基本と実践-
oikon48
45
27k
Multimodal AI Driving Solutions to Societal Challenges
keio_smilab
PRO
1
130
Security Diaries of an Open Source IAM
ahus1
0
120
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.1k
Designing for Performance
lara
610
69k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
GraphQLとの向き合い方2022年版
quramy
50
14k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Rails Girls Zürich Keynote
gr2m
95
14k
A better future with KSS
kneath
240
18k
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 ご清聴ありがとうございました!