文字列内の文字をどれくらい速く置き換えることができますか?
したがって、この質問の背景は次のとおりです。ソケットを介して相互に通信し、クライアントのアプリケーションと通信するアプリケーションがいくつかあります。これらのソケットメッセージには、印刷できない文字(chr(0)など)が含まれています。ソケットメッセージはログファイルに保存されるため、事前に定義された文字列( "{Nul}"}など)に置き換える必要があります。すべてのログメッセージでは、文字を置き換える必要があります。
今、私はこのサイトの別の投稿から見つけたこのMSDNリンクからこの小さな冒険を読んで始めました。
私たちが使用した現在の方法...一日の初めに...StringBuilderを使用して、次のようなすべての可能な置換をチェックしていました...
Public Function ReplaceSB(ByVal p_Message As String) As String
Dim sb As New System.Text.StringBuilder(p_Message)
sb.Replace(Chr(0), "{NUL}")
sb.Replace(Chr(1), "{SOH}")
Return sb.ToString
End Function
ブログの投稿でStringBuilderを省略し、string.replaceを使用すると、より高速な結果が得られることが指摘されています。(実際、StringBuilderを使用することは、これを1日中行うのに最も遅い方法でした。)
p_Message = p_Message.Replace(Chr(0), "{NUL}")
p_Message = p_Message.Replace(Chr(1), "{SOH}")
すべてのメッセージがこのプロセスを通過する必要があるわけではないことを知っていたので、省略される可能性のあるメッセージを処理する必要がないので時間を節約できると思いました。そのため、正規表現を使用して、最初に文字列を検索し、次に文字列を処理する必要があるかどうかを判断しました。これは、string.replaceを使用するのとほぼ同じでした。基本的に、すべての文字列を処理しない時間を節約することで時間を節約できますが、正規表現ですべての文字列をチェックすることで時間を失うことになります。
次に、インデックスを新旧と一致させるいくつかの配列を使用して、それを使用してメッセージを処理することをお勧めします。だから、こんな感じになります...
Private chrArray() As Char = {Chr(0), Chr(1)}
Private strArray() As String = {"{NUL}", "{SOH}"}
Public Function TestReplace(ByVal p_Message As String) As String
Dim i As Integer
For i = 0 To ((chrArray.Length) - 1)
If p_Message.Contains(chrArray(i).ToString) Then
p_Message = p_Message.Replace(chrArray(i), strArray(i))
End If
Next
Return p_Message
End Function
これまでのところ、これらのメッセージを処理するために私が見つけた最速の方法です。着信文字列を文字配列に変換して比較したり、chrArrayではなく文字列をループしたりするなど、他のさまざまな方法を試しました。
ですから、すべての人への私の質問は、これをさらに速くすることはできますか?私は何が欠けていますか?