はじめに
文字列の中から特定の文字列を検索する場面はよくある場面かと思います。
どの検索方法が最速なのか、検証してみました。
今回は、先頭の文字列を検索する場合です。
お題: 東京都足立区の先頭が東京都に一致するかどうか検索する
テストする機能
Instr 関数
like 演算子
RegExpオブジェクトのTestメソッド
Left関数
ワークシート関数の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から呼び出す局面は考えにくいですが・・・。
今回は先頭の文字列を判定する機能の速度調査でした。文字列の先頭だけを検索する場合の参考になれば。
テストしたプログラム
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