小島 夏海 @replu5
2024 年 6 月 8 日
Go Conference 2024
現在 Go では Map の内部実装を SwissTable を使用したものに置き換えることでパフォーマンスを向上させる案が 議論 されています。 SwissTable は Rust や abseil(Googleが公開したC++のライブラリ) で使用されている実装です。
本セッションでは、 SwissTable の概要と利点の紹介に留まらず、 Map 内部実装を変更するという影響範囲が広い変更について、 Go Team がどのような考慮をしているかやどんな議論がされているかを紹介します。
このセッションを通じて、 Go の内部実装が変更される可能性に伴う議論を紹介することで、この提案の議論から Go の開発において Go Team が考慮している点や姿勢について学んだことを共有できればと思っています。 加えて、 SwissTable への理解を深めることで、変更が Go 本体に採用されなかった場合にも、アルゴリズムの特性がみなさんが作成しているサービスに適しているかどうか判断できるようになり、必要な場合には SwissTable を独自実装したりサードパーティ実装を使用したりすることで、 Map を伴う処理の高速化が必要になった時の手助けができればと幸いです。
スライドに記載しているリンク
P.29 拡張後の取得
https://github.com/golang/go/blob/go1.22.4/src/runtime/map.go#L419-L430
P.32 拡張後の登録
https://github.com/golang/go/blob/go1.22.4/src/runtime/map.go#L609-L612
https://github.com/golang/go/blob/go1.22.4/src/runtime/map.go#L1140-L1149
P.58 議論されているissueでのやり取り抜粋
https://github.com/golang/go/issues/54766
P.68 mapの拡張条件
https://github.com/cockroachdb/swiss/blob/main/map.go#L1028-L1057
P.70 まとめ
https://github.com/cockroachdb/swiss
P.71 ベンチマーク(sec/op)
https://gist.github.com/aclements/9fb32ac0a287d2ff360f1bc166cdf4b8
参考文献
SwissTable
runtime: use SwissTable
CppCon 2017: Matt Kulukundis "Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step"
cockroachdb/swiss: Go port of Google's Swiss Table hash table
Swiss Tables Design Notes
Swisstable, a Quick and Dirty Description
Extendible hashing
Swisstable Hash に使われているビット演算の魔術
既存実装
map.go
【Go】Mapの内部構造とO(1)のメカニズム:
How the Go runtime implements maps efficiently (without generics)