動機
あるプロジェクトで楽曲一覧を表示する時、ユニークなリストの生成があまりにも遅かったので、色々速度比較をしてみました。
実験
以下の方法で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
を使ったほうが良さそうです。