UWSCの正規表現とToken処理
ちょっと正規表現をいじっていて、思い立った。
正規表現でTokenもどきが出来るのでは?と。
結果ですが、、、長大な文字列では、正規表現の方が早い。
Tokenは文字列編集を繰り返すからでしょうね。
多分、長大でなかったら、メモリ分Tokenが有利かな?
以下のようなスクリプトを実施。
結果は、正規表現版が8秒、Token版が9秒。
わずかに差が見られました。
文字列が長大になればなるほど差は広がるようです。
、、、ほとんどPrintコストだけど。
TestToken(10000) PROCEDURE RegexToken(str) DIM regex = CREATEOLEOBJ("VBScript.RegExp"), matches WITH regex .Pattern = "[^,]+" // 連続した区切りの無視になるね .Global = TRUE matches = .Execute(str) ENDWITH DIM i, m = matches.Count - 1 FOR i = 0 TO m PRINT matches.Item(i).Value NEXT FEND PROCEDURE NormalToken(str) // カンマが連続している場合、この件数カウント方式は破綻する // Whileでstrが空まで繰り返すのもよさげ DIM i, m = LENGTH(str) - LENGTH(REPLACE(str, ",", "")) FOR i = 0 TO m PRINT TOKEN(",", str, TRUE) NEXT FEND PROCEDURE TestToken(num) DIM str = ",", i, start FOR i = 1 TO num str = str + i + "," NEXT PRINT "TestToken start" start = GETTIME() RegexToken(str) DIM regexTime = GETTIME() - start start = GETTIME() NormalToken(str) DIM tokenTime = GETTIME() - start PRINT "RegexToken(" + num + ") " + regexTime PRINT "NormalToken(" + num + ") " + tokenTime FEND
さきに分解しちゃうので、件数が判るのも正規表現版のメリットですね。
、、、しかし、Token版のコードのシンプルなこと、、、。