はじめに
文字列の中から特定の文字列を検索する場面はよくある場面かと思います。
どの検索方法が最速なのか、検証してみました。
今回は、先頭の文字列を検索する場合です。
お題:東京都足立区の先頭が東京都に一致するかどうか検索する
テストする機能
- 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