Excel VBA > ツール・システム紹介 > Excelでベンチマークしてみる
このエントリーをはてなブックマークに追加

Excelでベンチマークしてみる

PC交換などでExcelが重たく感じたとき

PCを交換した時やチューンアップをした時にExcelの動きがちょっと重たくなった感じがあり、「本当にそうだろうか?」という疑念もあったのでベンチマークっぽいものを作りました。
「ベンチマークっぽい」というのは、そもそもPC自体のベンチマークを測定するツールが出回っていますので、本来はそちらを使うべきだろうというのと、Excelでやったらどうなるかというので見よう見まねで作成したツールだからです。

PC同士の違いが判る

このツールではPC同士のあるいは、PC改造前と改造後などの違いが判れば十分ということで作成しました。本来はメモリ情報などもほしかったのですがExcel VBA(Excel2010)単体ではこれらの値が取得できなくなったようなのであきらめました。
一応?シーケンシャルとランダムの読み書きを意識しました。

9個の処理を各3回繰り返しています。このロジックは新しいPCで試しながら作ったため、古いPCで試すと恐ろしく時間がかかってしまいました。
後で確認するようにExcelに結果を出力できるようにもしました。

コードはそれほど難しくない

正規のベンチマークツールのロジックはかなり専門性が高いと思いますが、それを無視して言えば、このベンチマークもどきのツールに限ってはそれほど難しくないと思います。
各処理をタイマー(Timer)関数を使って処理時間を計測しています。

‘*************************************************************
‘■■■■HDD■■■■
‘*************************************************************

‘===============================================
‘Write Seqential access
‘===============================================
Function Write_HDD_SQ_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    For lngRow = 1 To lngMax
        Wsh.Cells(lngRow, 1).Value = lngRow
        Call Progress_Bar(lngRow)
    Next lngRow

    Write_HDD_SQ_Access = Timer – dblSTimer

End Function

‘===============================================
‘Write Rondom access
‘===============================================
Function Write_HDD_Random_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    For lngRow = 1 To lngMax
        Wsh.Cells(Int((lngMax – 1 + 1) * Rnd + 1), 2).Value = lngRow
        Call Progress_Bar(lngRow)
    Next lngRow

    Write_HDD_Random_Access = Timer – dblSTimer

End Function

‘===============================================
‘Read Seqential access
‘===============================================
Function Read_HDD_SQ_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData As String

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    For lngRow = 1 To lngMax
        strData = Wsh.Cells(lngRow, 1).Value
        Call Progress_Bar(lngRow)
    Next lngRow

    Read_HDD_SQ_Access = Timer – dblSTimer

End Function

‘===============================================
‘Read Rondom access
‘===============================================
Function Read_HDD_Random_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData As String

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    For lngRow = 1 To lngMax
        strData = Wsh.Cells(Int((lngMax – 1 + 1) * Rnd + 1), 2).Value
        Call Progress_Bar(lngRow)
    Next lngRow

    Read_HDD_Random_Access = Timer – dblSTimer

End Function

‘*************************************************************
‘■■■■MEMORY■■■■
‘*************************************************************

‘===============================================
‘Write Memroy Seqential Access
‘===============================================
Function Write_Mem_SQ_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData() As String

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    ReDim strData(lngMax) As String
    For lngRow = 1 To lngMax
        strData(lngRow) = Wsh.Cells(lngRow, 1).Value
        Call Progress_Bar(lngRow)
    Next lngRow

    Write_Mem_SQ_Access = Timer – dblSTimer

End Function

‘===============================================
‘Write Memroy Random Access
‘===============================================
Function Write_Mem_Random_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData() As String

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    ReDim strData(lngMax) As String
    For lngRow = 1 To lngMax
        strData(Int((lngMax – 1 + 1) * Rnd + 1)) = Wsh.Cells(lngRow, 1).Value
        Call Progress_Bar(lngRow)
    Next lngRow

    Write_Mem_Random_Access = Timer – dblSTimer

End Function

‘===============================================
‘Read Memroy Seqential Access
‘===============================================
Function Read_Mem_SQ_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData() As String

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    ReDim strData(lngMax) As String
    For lngRow = 1 To lngMax
         Wsh.Cells(lngRow, 1).Value = strData(lngRow)
         Call Progress_Bar(lngRow)
    Next lngRow

    Read_Mem_SQ_Access = Timer – dblSTimer

End Function

‘===============================================
‘Read Memroy Random Access
‘===============================================
Function Read_Mem_Random_Access()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData() As String

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    lngMax = lngGetMaxCount
    ReDim strData(lngMax) As String
    For lngRow = 1 To lngMax
        Wsh.Cells(lngRow, 1).Value = strData(Int((lngMax – 1 + 1) * Rnd + 1))
        Call Progress_Bar(lngRow)
    Next lngRow

    Read_Mem_Random_Access = Timer – dblSTimer

End Function

‘*************************************************************
‘■■■■CPU■■■■
‘*************************************************************

‘===============================================
‘calculation
‘===============================================
Function Calculation()

    Dim Wsh As Worksheet
    Dim lngRow As Long
    Dim dblSTimer As Double
    Dim lngMax As Long
    Dim strData As String
    Dim dtDate As Date

    dblSTimer = Timer

    Set Wsh = GetWorkbook.Worksheets(strGetSheetName)

    dtDate = #1/1/1999 11:59:59 AM#

    lngMax = lngGetMaxCount
    For lngRow = 1 To lngMax
        strData = VBA.DateValue(dtDate) + VBA.TimeValue(dtDate) + VBA.IIf(1 = 1, 1000, 0)
        Call Progress_Bar(lngRow)
    Next lngRow

    Calculation = Timer – dblSTimer

End Function

もしかしたら付け加えるかもしれないと考えたので、メンテが容易になるように別のモジュールからPropertyプロシージャでループ回数を取得し(ツール2万回にしました)、計測用に書き込むシート名も同様にしました。

カテゴリ:ツール・システム紹介