emahiro/b.log

Drastically Repeat Yourself !!!!

Go で重複を削除する処理のパフォーマンスについて

Overview

※ 過去何度か上げた内容のエントリの更新版です。

Go で Slice から重複してる要素を排除する unique の処理について実装方法でパフォーマンスが異なるのでこのエントリを書いています。

最近暇つぶしに少し手を出してる leetCode の配列操作の問題に触発されてこのエントリを書いています。

leetcode.com

なお過去上げた重複削除関連のエントリは以下

ema-hiro.hatenablog.com

ema-hiro.hatenablog.com

具体的な実装方法

今日のネタにする重複削除の実装についてはいかにコードを挙げています。

github.com

パフォーマンスについて

ざっくりパフォーマンスを測定したら以下のような結果になりました。
これだけ見ると Sort した状態の Slice を対象にしてるとはいえ Generics を使った実装は効率がいいことがわかります。
Generics が出てくるまでの実装と比べて for loop 一度で重複を削除できる処理と同じくらいのパフォーマンスになりました。

※ 一方でこんかいのベンチは Flatten かつ Sorted な Slice に限るので、このパフォーマンスを引き出すには条件があるベンチの結果でもあります。

go test -v -bench=. -benchmem
goos: darwin
goarch: arm64
pkg: sample.com/go-sandbox
Benchmark
Benchmark/unique_normal
Benchmark/unique_normal-10          11301798           90.41 ns/op         48 B/op         2 allocs/op
Benchmark/unique_faster
Benchmark/unique_faster-10          856136389           1.404 ns/op         0 B/op         0 allocs/op
Benchmark/unique_generic
Benchmark/unique_generic-10         853362406           1.409 ns/op         0 B/op         0 allocs/op
PASS
ok      sample.com/go-sandbox   4.124s