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版のコードのシンプルなこと、、、。