動機
あるプロジェクトで楽曲一覧を表示する時、ユニークなリストの生成があまりにも遅かったので、色々速度比較をしてみました。
実験
以下の方法で100回繰り返してみます。
(arrayは0から1000のランダムな配列です。)
方法1
オーソドックスにforで回してみます。
var uniqueArray = [Int]()
for i in array{
if !uniqueArray.contains(i) {
uniqueArray.append(i)
}
}
方法2
Array::reduceを使ってみます。
array.reduce(into: [Int]()) {a,b in
a.contains(b) ? () : a.append(b)
}
方法3
標準ライブラリのSetを使ってみます。
Array(Set(array))
結果
for方式 |
Array::reduce方式 |
Set方式 |
|---|---|---|
| 7.37(sec) | 7.58(sec) | 0.03(sec) |
Setがあまりにも早く誤差が大きそうなので
同じ配列でもう一度 for、reduceは100回、Setは1000回、回してみます。
for方式 |
Array::reduce方式 |
Set方式 |
|---|---|---|
| 77.56(sec) | 75.81(sec) | 0.30(sec) |
forとArray::reduceはほぼ同速
Setが250倍ほど早いですね。
結論
ここまで違うとは思っていませんでした。
Swiftでユニークな配列を作るときは間違いなくSetを使ったほうが良さそうです。