1

データを RichTextBox1 にコピーして処理する 12 MB のファイルがあります。完了するまでに約 4 秒かかりますが、(RegexOptions.Compiled) を使用して高速化するように言われましたが、両方。

Debug.Print(ParseData2(RichTextBox1.Text, "start", "end"))

これは関数ですが、テストを行っている場所にコメントしました

Function ParseData2(strData As String, ByVal sStart As String, ByVal sStop As String)
    'Dim r As New Regex(sStart & "(.*?)(" & sStop & "|$)", RegexOptions.Multiline Or RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    Dim r As New Regex(sStart & "(.*?)(" & sStop & "|$)", RegexOptions.Multiline Or RegexOptions.IgnoreCase)
    Dim matches = r.Matches(strData)
    Dim i As Integer = 1
    For Each m As Match In matches
        'Debug.Print("    match #" & i & ": " & m.Groups(1).Value)
        i += 1
    Next
    Return matches.Count
End Function
4

2 に答える 2

3

「RegEx」と「Fast」を一緒に使用することはできません。単純な文字列分割/部分文字列は、通常の表現を使用するよりも高速です。

MSDN から: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

Regex.Compiled:

正規表現がアセンブリにコンパイルされることを指定します。これにより、実行が高速になりますが、起動時間が長くなります。CompileToAssembly メソッドを呼び出すときに、この値を Options プロパティに割り当てないでください。

http://social.msdn.microsoft.com/Forums/en-US/2b1dd1ad-2ea9-46df-a15a-61a40efcf113/regexoptionscompiled?forum=regexp

RegexOptions.Compiled オプションを指定すると、フレームワークは、正規表現 (コンパイル済みの正規表現) を処理するカスタム メソッドを使用して動的アセンブリを作成します。

問題は、動的アセンブリへの正規表現のコンパイルに時間がかかることです。そのため、正規表現オブジェクトがコンパイル済みオプションで初めて作成されるときは、非常に長い時間がかかります。Match() または Replace() への後続の呼び出しは、コンパイルされていない正規表現よりも少し速く実行されます。

Regex のプリコンパイルは、アプリケーションの早い段階で Regex オブジェクトを作成し、それを頻繁に再利用する場合にのみ役立ちます。

私は専門家ではありませんが、正規表現を使用して速度を上げるために既に行ったこと以上のことはできないと思います。ストリームを使用してデバッグ情報を書き込むと、「より速く」表示される可能性があります (しかし、おそらく1 秒以内の差)。

しかし、コードを少しだけ改善して、関数の戻り値のデータ型を割り当てることができるとコンパイラに推測させないようにすることができます。

 Private Function ParseData2(...) As Integer

そして、matches 変数の型:

 Dim matches As MatchCollection = r.Matches(strData)

また、VB では、すべてのものが 1 からではなく 0 からカウントを開始します。これを使用することを検討してください。

 Dim i As Integer = 0
于 2013-10-20T07:25:56.760 に答える
0

RegexOptions.Compiled についてはわかりませんが、出現回数を数えていただけませんか? もしそうなら、これを試してみるべきかもしれません

match.Captures["Digits"].Length

詳細はこちらhttp://blogs.msdn.com/b/ericgu/archive/2006/03/06/544553.aspx

于 2013-10-20T07:18:55.133 に答える