<< 残念なRecentFileオブジェクト | main | 日付のグループ化 >>

ベンチマーク(2)

0
    Excel 2003とExcel 2007で、並べ替えの速度を比較してみました。
    セル範囲A1:A60000にランダムな数値を入力し、この範囲を並べ替えます。
    並べ替えのコードは、マクロ記録で生成されたコードを使いました。
    まず、Excel 2003の結果からご覧ください。


    Sub Macro1() ''マクロ記録で生成されたままのコード
    Dim i As Long, j As Long
    Dim Start As Long, Finish As Long
    Application.ScreenUpdating = False
    ''60000個の乱数を入力
    For i = 1 To 10
    For j = 1 To 60000
    Randomize
    Cells(j, 1) = Int(Rnd() * 1000000)
    Next j
    Start = GetTickCount()
    ''マクロ記録で生成されたコード(ここから)
    Range("A1:A60000").Sort Key1:=Range("A1"), Order1:=xlAscending, _
    Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
    Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
    DataOption1:=xlSortNormal
    ''マクロ記録で生成されたコード(ここまで)
    Finish = GetTickCount()
    Debug.Print (Finish - Start) / 1000 & "秒"
    Next i
    Application.ScreenUpdating = True
    End Sub


    1回目0.250秒
    2回目0.250秒
    3回目0.234秒
    4回目0.250秒
    5回目0.281秒
    6回目0.250秒
    7回目0.250秒
    8回目0.250秒
    9回目0.250秒
    10回目0.234秒
    平均0.250秒



    マクロ記録で生成されるコードは、決して最適化されていません。指定しなくてもいいプロパティなども律儀に規定値を指定したりしますので、不要な部分を削ったコードでもう一度やってみました。


    Sub Macro2() ''シンプルにしたコード
    Dim i As Long, j As Long
    Dim Start As Long, Finish As Long
    Application.ScreenUpdating = False
    ''60000個の乱数を入力
    For i = 1 To 10
    For j = 1 To 60000
    Randomize
    Cells(j, 1) = Int(Rnd() * 1000000)
    Next j
    Start = GetTickCount()
    Range("A1:A60000").Sort Key1:=Range("A1")
    Finish = GetTickCount()
    Debug.Print (Finish - Start) / 1000 & "秒"
    Next i
    Application.ScreenUpdating = True
    End Sub


    1回目0.266秒
    2回目0.235秒
    3回目0.234秒
    4回目0.250秒
    5回目0.234秒
    6回目0.250秒
    7回目0.265秒
    8回目0.250秒
    9回目0.250秒
    10回目0.234秒
    平均0.247秒


    あまり変わりませんね。差は誤差の範囲でしょう。
    さて、同じように60000個の数値をExcel 2007で並べ替えてみます。こちらも最初は、マクロ記録で生成されたコードを使います。
    なお、見ていただくとわかりますが、並べ替えに関するオブジェクトはExcel 2007で新しくなっています


    Sub Macro3() ''マクロ記録されたままのコード
    Dim i As Long, j As Long
    Dim Start As Long, Finish As Long
    Application.ScreenUpdating = False
    ''60000個の乱数を入力
    For i = 1 To 10
    For j = 1 To 60000
    Randomize
    Cells(j, 1) = Int(Rnd() * 1000000)
    Next j
    Start = GetTickCount()
    ''マクロ記録で生成されたコード(ここから)
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add _
    Key:=Range("A1"), SortOn:=xlSortOnValues, _
    Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:A60000")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With
    ''マクロ記録で生成されたコード(ここまで)
    Finish = GetTickCount()
    Debug.Print (Finish - Start) / 1000 & "秒"
    Next i
    Application.ScreenUpdating = True
    End Sub


    1回目0.375秒
    2回目0.375秒
    3回目0.391秒
    4回目0.391秒
    5回目0.375秒
    6回目0.469秒
    7回目0.375秒
    8回目0.390秒
    9回目0.375秒
    10回目0.391秒
    平均0.391秒


    Excel 2003に比べて6割ほど遅くなったでしょうか。
    こちらも、マクロ記録で生成されたコードから不要部分をカットしてみましょう。


    Sub Macro2() ''シンプルにしたコード
    Dim i As Long, j As Long
    Dim Start As Long, Finish As Long
    Application.ScreenUpdating = False
    ''60000個の乱数を入力
    For i = 1 To 10
    For j = 1 To 60000
    Randomize
    Cells(j, 1) = Int(Rnd() * 1000000)
    Next j
    Start = GetTickCount()
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add _
    Key:=Range("A1")
    With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:A60000")
    .Apply
    End With
    Finish = GetTickCount()
    Debug.Print (Finish - Start) / 1000 & "秒"
    Next i
    Application.ScreenUpdating = True
    End Sub


    1回目0.359秒
    2回目0.391秒
    3回目0.391秒
    4回目0.391秒
    5回目0.375秒
    6回目0.391秒
    7回目0.375秒
    8回目0.390秒
    9回目0.375秒
    10回目0.375秒
    平均0.381秒


    気落ち速くなりましたかね。まぁ、ほとんど差はないと見ていいでしょう。

    続いてもう一つ確認です。
    Excel 2007では、このように新しいオブジェクトなどが新設されていますが、Excel 2003までの古いオブジェクトもそのまま使えるようになっています。つまり、Excel 2003で実行したコードは、Excel 2007でも同じように動作するはずなんです。上記のうち、Excel 2003で検証したコード「Sub Macro2 (シンプルにしたコード)」を、そのままExcel 2007で実行してみましょう。こちらは、結果だけお見せします。

    1回目0.406秒
    2回目0.391秒
    3回目0.391秒
    4回目0.406秒
    5回目0.406秒
    6回目0.406秒
    7回目0.406秒
    8回目0.421秒
    9回目0.421秒
    10回目0.406秒
    平均0.406秒


    一番遅い結果となりましたね。
    以上の検証から次のことがわかりました。

    ・Excel 2007では"並べ替え"のオブジェクトが新しくなった
    ・"並べ替え"の動作は、Excel 2003より遅くなった
    ・古いオブジェクトをExcel 2007で使うと遅くなった


    並べ替えの動作検証だけでは何とも言えませんが、Excel 2007のマクロで速度を気にするなら、Excel 2007用の新しいオブジェクトを使えってことでしょうか。引き続き、いろんな動作で速度を検証してみようと思います。

    コメント
    コメントする









    この記事のトラックバックURL
    トラックバック
    Topページへ戻る
    calendar
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
    << January 2018 >>
    selected entries
    categories
    archives
    recent comment
    recent trackback
    recommend
    recommend
    recommend
    recommend
    recommend
    links
    profile
    search this site.
    others
    mobile
    qrcode