上記の時間計測に関するTipsは、実はCollectionを使ったデータ格納/検索と、ArrayListを使った場合の速度の違いを調べようとしていた副産物。キーを持たないデータなので、Collectionを使う必要は全く無い(というか、キーが事前に用意されていないデータしか無いので、Collectionの強みであるキーによる検索が使えない)。そのため、ArrayListでもいいんじゃないか、というのが今回の検証の動機。
まずはAddメソッドの処理速度を見る。
Private Sub Prepare()
Dim testCol As New Collection
Dim testArray As New ArrayList
Dim startTime, endtime As Date
Trace.WriteLine("COLLECTION ADD")
startTime = Now
For i As Integer = 1 To 10000
testCol.Add(i.ToString)
Next
endTime = Now
Trace.WriteLine("START: " & Format(startTime, "hh:mm:ss:fff"))
Trace.WriteLine(" END: " & Format(endTime, "hh:mm:ss:fff"))
Trace.WriteLine("ARRAYLIST ADD")
startTime = Now
For i As Integer = 1 To 10000
testArray.Add(i.ToString)
Next
endTime = Now
Trace.WriteLine("START: " & Format(startTime, "hh:mm:ss:fff"))
Trace.WriteLine(" END: " & Format(endTime, "hh:mm:ss:fff"))
End Sub
結果は、
COLLECTION ADD START: 11:50:05:046 END: 11:50:05:062 ARRAYLIST ADD START: 11:50:05:062 END: 11:50:05:078
変わらない。だいたいどちらも16ミリセカンド。
次に、そこからFor Eachで1件ずつ比較して、条件に一致する情報を取り出すテストを行ってみる。For Eachなのでどの順に取り出すかがフレームワーク任せ(実際は決まっているのだろうけど)というのはあるが、何度か試せば傾向は見えるだろう。
Private Sub PrepareArray()
Dim startTime, endtime As Date
Trace.WriteLine("ARRAYLIST ADD")
startTime = Now
For i As Integer = 1 To 10000
testArray.Add(i.ToString)
Next
endtime = Now
Trace.WriteLine("START: " & Format(startTime, "hh:mm:ss:fff"))
Trace.WriteLine(" END: " & Format(endtime, "hh:mm:ss:fff"))
End Sub
Private Sub SearchTestArray()
Dim startTime, endtime As Date
Trace.WriteLine("ARRAYLIST SEARCH")
startTime = Now
For Each obj As Object In testArray
If CType(obj, Integer) = 8000 Then
Exit For
End If
Next
endtime = Now
Trace.WriteLine("START: " & Format(startTime, "hh:mm:ss:fff"))
Trace.WriteLine(" END: " & Format(endtime, "hh:mm:ss:fff"))
End Sub
上記のSubを連続して呼出し、時間をみてみた。上記はArrayListの例。
COLLECTION ADD START: 01:31:02:953 END: 01:31:02:968 COLLECTION SEARCH START: 01:31:02:968 END: 01:31:03:828 ARRAYLIST ADD START: 01:31:22:375 END: 01:31:22:390 ARRAYLIST SEARCH START: 01:31:22:390 END: 01:31:22:437
同様にCollectionの処理も作って試してみた結果が上記。ArrayListだと、For Eachの検索で、1〜10000の数値から8000を探すのに約15ミリ秒。遅いケースでも30ミリ秒。ところが、Collectionだと、上記の例で860ミリ秒。遅い場合だと、2秒近くかかっている場合もあった。
というわけで、キー検索を用いない単純突っ込み&保持であれば、ArrayListが速い。