適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

VBAにおける文字列検索はどれが一番速いのか_先頭編

はじめに

文字列の中から特定の文字列を検索する場面はよくある場面かと思います。

どの検索方法が最速なのか、検証してみました。

今回は、先頭の文字列を検索する場合です。

お題:東京都足立区の先頭が東京都に一致するかどうか検索する

テストする機能

  1. Instr 関数
  2. like 演算子
  3. RegExpオブジェクトのTestメソッド
  4. Left関数
  5. ワークシート関数のfind関数

テストした環境

OS:Windows10 Pro
CPU:Intel Core i5-4300U
メモリ:4G
Excel:2019

比較内容

お題を100万回処理する時間。10回の平均を比較。

結果

順位 機能 速度
1位 like演算子 0.031641秒
2位 Instr関数 0.070703秒
3位 RegExp 0.23125秒
4位 Left関数 0.246875秒
5位 find関数 4.164453秒

一番速いのはlike演算子!!

なんとなく予想はしてましたが、やはりlike演算子が一番速いですね。

そして予想以上にInstr関数が早くてびっくり。

like演算子かInstr関数のどちらかを使えば実務上問題なさそうですね。

ワークシート関数は桁が違う・・・。

わざわざVBAから呼び出す局面は考えにくいですが・・・。

先頭の文字列を判定する機能の速度調査でした。

文字列の先頭だけを検索する場合に選ぶ命令の指標のひとつになれば。

ここまでお読み頂き、ありがとうございます。

似たようなことをしている記事もありますので、そちらもご参照頂ければ幸いです(記事の雰囲気はだいぶ違いますが)。

www.tekizai.net

テストしたプログラム

参考にテストに使用したプログラムを載せておきます。

 
Option Explicit
Dim reg As RegExp
Dim i As Long
Const EXPRESSION As String = "東京都足立区"
Const PATTERN As String = "東京都"
Const PATTERN2 As String = "東京都*"

Sub main()
    Dim i As Long
    For i = 1 To 10
        doTest
    Next i
End Sub

Sub doTest()
    Const CNT As Long = 1000000
    Set reg = New RegExp
    Dim startDouble As Double: startDouble = Timer
    Dim rec As String
    'rec = InstrTest(CNT)
    'rec = LikeTest(CNT)
    'rec = WorksheetFunctionTest(CNT)
    rec = LeftTest(CNT)
    'rec = RegExpTest(CNT)
    Dim endDouble As Double: endDouble = Timer
    Debug.Print rec & "," & endDouble - startDouble & "," & CNT
End Sub

Function InstrTest(kai) As String
    For i = 1 To kai
        If InStr(EXPRESSION, PATTERN) > 0 Then
        End If
    Next i
    InstrTest = "InstrTest"
End Function

Function LikeTest(kai As Long) As String
    For i = 1 To kai
        If EXPRESSION Like PATTERN2 Then
        End If
    Next i
    LikeTest = "LikeTest"
End Function

Function WorksheetFunctionTest(kai As Long) As String
    For i = 1 To kai
        If WorksheetFunction.Find(PATTERN, EXPRESSION) > 0 Then
        End If
    Next i
    WorksheetFunctionTest = "WorksheetFunctionTest"
End Function

Function RegExpTest(kai As Long) As String
    reg.PATTERN = PATTERN
    For i = 1 To kai
        If reg.test(EXPRESSION) Then
        End If
    Next i
    RegExpTest = "RegExpTest"
End Function

Function LeftTest(kai As Long) As String
    For i = 1 To kai
        If Left(EXPRESSION, 3) = PATTERN Then
        End If
    Next i
    LeftTest = "LeftTest"
End Function