ReDimとCollectionの速さを比べる

これまで同種のデータの集合といえば当然のように配列(Array)を使っていたのですが、最近Collectionという便利なクラスを知ったので使い始めたところとても便利で良い感じです。
とはいえ配列にも便利な部分はあり、まとめると以下のような感じです。

Collection

  • 良い点
    • 宣言がHoges As Collectionなのでわかりやすい
    • 要素数を気にしなくて良い
    • 型を気にしなくて良い
  • 悪い点
    • 追加した要素の内容を変更できない
    • 何が入っていたか忘れる

Array




  • 良い点
    • 軽くて早い
    • 型を指定できる
    • 代入した内容の変更ができる
  • 悪い点
    • 動的配列を扱うのが面倒

さて、web上に「Collectionは配列に比べると遅い」という話があったので検証してみました。


【コード】
Option Explicit

Dim StartTime As Double
Dim EndTime As Double
Dim i As Long
Dim c As Collection
Dim a() As Long

Const cnt As Long = 1000000

Public Sub main()
    Dim row As Long
    For row = 1 To 10
        Cells(row, 1) = main1
        Cells(row, 2) = main2
    Next row
End Sub

Public Function main1()
    
    StartTime = Timer
    ReDim a(cnt)
    For i = 1 To cnt
        a(i) = i + i
    Next i
    EndTime = Timer
    
    main1 = TimeCount(EndTime - StartTime)
End Function

Public Function main2()
    StartTime = Timer
    Set c = New Collection
    For i = 1 To cnt
        c.Add Item:=i + i
    Next i
    EndTime = Timer

    main2 = TimeCount(EndTime - StartTime)
End Function

Private Function TimeCount(times As Double) As Double
    TimeCount = Format$(Int(times * 10 ^ 7 + 0.5) / 10 ^ 7)
End Function


ここでcntの値を適当に変えながら実行時間を測定したものが以下。(各cnt数につき10回の試行の平均値)
だいたい5~10倍程度Collectionの方が遅いという感じになりました。とはいえ要素数を気にせずAddで追加していける楽さは捨てがたいので、速度がシビアでなければCollectionを使うのは十分アリだと思います。
(Core-i7 2640M 2.80GHzにて測定)





コメント

このブログの人気の投稿

TS-220にGitをインストールしてリモートリポジトリを構築する方法まとめ

Excel VBAでやるオブジェクト指向プログラミング