1

RegExとIsLetterを使用したループのどちらがパフォーマンスに優れているかを教えてください。

私はこれを両方の方法で試しましたが、正規表現はForループよりも少し時間がかかっていることがわかりました...

Dim vStr1 As String, vStr2 As New StringBuilder

vStr1 = "Testadfasdfadsfasdfadsfas12312dfadsfdsa23131fadsfsadfsadf1sss 23 -1234"    

Method 1
-------------------
vStr2.Clear()
For Each vChr In vStr1
    If Char.IsLetter(vChr) = False Then vStr2.Append(vChr)
Next
vStr1 = vStr2.ToString
-------------------------

Method 2
-------------------
vStr1 = Regex.Replace(vStr1, "[A-Za-z^s]", "")
4

2 に答える 2

1

調べる方法は次のとおりです。

  1. http://www.linqpad.net/からLINQPadをダウンロードします
  2. 置き換える2つの関数を書く
  3. Stopwatch10000回以上の反復を使用してパフォーマンスを確認します
于 2013-01-04T16:39:57.887 に答える
1

ループ方式が高速になります。これらの単純なケースでは、正規表現を1つにコンパイルする必要はなく、ほとんどの場合、正規表現は緩いです。

方法1では、vStr2の容量をvStr1の長さに設定すると、メモリの割り当てが遅くなるのを防ぐことができます。

Dim vStr1 As String
vStr1 = "Testadfasdfadsfasdfadsfas12312dfadsfdsa23131fadsfsadfsadf1sss 23 -1234"
Dim vStr2 As New StringBuilder(vStr1.Length)

また、これを複数回行う場合は、StringBuilderを破棄して新しいものを割り当てるのではなく、vStr2.Clear()を使用してください。

方法2では、正規表現をコンパイルすることで改善できます。また、文字リストに^ sが含まれている理由もわかりませんが、別の結果が得られるのではないでしょうか。

于 2013-01-04T17:06:59.740 に答える