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
380
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
150
Goトランザクション処理
matumoto
1
50
いまいちどスライスの 挙動を見直してみる
matumoto
0
350
Go1.22のリリース予定の機能を見る
matumoto
0
67
GoのUnderlying typeについて
matumoto
0
200
Typed-nilについて
matumoto
0
320
GoのType Setsという概念
matumoto
0
28
GoのRateLimit処理の実装
matumoto
0
370
Webプッシュ通知触ってみた
matumoto
0
34
Other Decks in Technology
See All in Technology
Trust as Infrastructure
bcantrill
0
230
KAGのLT会 #8 - 東京リージョンでGAしたAmazon Q in QuickSightを使って、報告用の資料を作ってみた
0air
0
190
PLaMo2シリーズのvLLM実装 / PFN LLM セミナー
pfn
PRO
2
830
生成AIで「お客様の声」を ストーリーに変える 新潮流「Generative ETL」
ishikawa_satoru
1
240
「Verify with Wallet API」を アプリに導入するために
hinakko
1
110
GA technologiesでのAI-Readyの取り組み@DataOps Night
yuto16
0
240
stupid jj tricks
indirect
0
7.6k
動画データのポテンシャルを引き出す! Databricks と AI活用への奮闘記(現在進行形)
databricksjapan
0
120
Optuna DashboardにおけるPLaMo2連携機能の紹介 / PFN LLM セミナー
pfn
PRO
1
750
SoccerNet GSRの紹介と技術応用:選手視点映像を提供するサッカー作戦盤ツール
mixi_engineers
PRO
1
130
インサイト情報からどこまで自動化できるか試してみた
takas0522
0
120
Why React!?? Next.jsそしてReactを改めてイチから選ぶ
ypresto
10
3.8k
Featured
See All Featured
Bash Introduction
62gerente
615
210k
Site-Speed That Sticks
csswizardry
11
870
Making Projects Easy
brettharned
118
6.4k
Thoughts on Productivity
jonyablonski
70
4.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
GraphQLとの向き合い方2022年版
quramy
49
14k
Faster Mobile Websites
deanohume
310
31k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Writing Fast Ruby
sferik
629
62k
A designer walks into a library…
pauljervisheath
208
24k
Documentation Writing (for coders)
carmenintech
75
5k
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 ご清聴ありがとうございました!