テクノロジー 注目度 85

Go言語における同時ハッシュマップ実装のベンチマーク比較

この記事は、Go言語で動作する複数の同時ハッシュマップライブラリの性能を比較したベンチマーク結果をまとめたものです。

著者はxsyncというライブラリを開発しているため、公平性を確保するために尽力したと述べています。ベンチマークでは、sync.Map(標準ライブラリ)、xsync.Map、cornelk/hashmap、alphadose/haxmap、orcaman/concurrent-mapの5つのハッシュマップ実装が比較対象となりました。

各ライブラリの性能は、キーサイズ(100、1,000、100,000、1,000,000)、GOMAXPROCSの数(1, 4, 8, 12)、読み込み/書き込みの割合(100%読み込み、99%読み込み、90%読み込み、75%読み込み)に基づいて評価されました。

結果として、xsync.Mapはほぼすべてのシナリオで最も速く、特に読み込み、書き込み、反復処理のスケーリングが優れていることが判明しました。sync.Mapは標準ライブラリであり依存関係がないという利点がありますが、他のライブラリと比較して書き込み時のメモリ使用量が多いです。cornelk/hashmapは小さなサイズでの読み込み重視ワークロードでは競争力がありますが、大きなサイズでの書き込み負荷下で性能が大幅に低下します。alphadose/haxmapは小さなサイズでの読み取り専用パフォーマンスが良いですが、高い並列性の下での書き込みスケーリングが劣ります。orcaman/concurrent-mapはメモリ使用量がゼロですが、固定された32個のシャードによりスケーラビリティが限られ、他のライブラリと比較して読み込み処理速度が遅く、反復処理速度も遅いという欠点があります。


背景

Go言語における同時ハッシュマップの実装は、並列処理アプリケーションにおいて重要な役割を果たします。このベンチマーク記事は、複数のライブラリの性能を比較し、開発者が適切な実装を選択する際に役立つ情報を提供することを目的としています。

重要用語解説

sync.Map: Go言語標準ライブラリに含まれる同時ハッシュマップ実装。Go 1.24以降はHashTrieMapに基づいており、ロックフリーの読み込みと部分的な書き込みを提供する。

[重要性: 高] [具体例: Go言語開発者にとって重要な選択肢]

xsync.Map: 外部ライブラリであるxsyncによって提供される同時ハッシュマップ実装。高いパフォーマンスと低いメモリ使用量を特徴とする。

[重要性: 高] [具体例: 並列処理アプリケーションで高速なハッシュマップが必要な場合に適している]

cornelk/hashmap: 外部ライブラリであるcornelk/hashmapによって提供される同時ハッシュマップ実装。小さなサイズでの読み込み重視ワークロードでは競争力があるが、大きなサイズでの書き込み負荷下で性能が低下する

[重要性: 中] [具体例: 小規模なアプリケーションや読み込み中心のタスクに適している]

alphadose/haxmap: 外部ライブラリであるalphadose/haxmapによって提供される同時ハッシュマップ実装。小さなサイズでの読み取り専用パフォーマンスが良いが、高い並列性の下での書き込みスケーリングが劣る

[重要性: 中] [具体例: 読み込み中心のタスクで、並列処理負荷が低い場合に適している]

orcaman/concurrent-map: 外部ライブラリであるorcaman/concurrent-mapによって提供される同時ハッシュマップ実装。メモリ使用量がゼロだが、固定されたシャード数によりスケーラビリティが限られ、他のライブラリと比較してパフォーマンスが劣る

[重要性: 低] [具体例: メモリ使用量を最小化したい場合に適している]

今後の影響

このベンチマーク結果は、Go言語で同時ハッシュマップを実装する開発者にとって貴重な情報源となります。特に、xsync.Mapは高いパフォーマンスと低いメモリ使用量を備えているため、並列処理アプリケーションの開発において注目すべきライブラリと言えるでしょう。一方、cornelk/hashmapやalphadose/haxmapは特定のシナリオに適している場合があるものの、一般的な用途には不向きである可能性があります。