我可以多快替换字符串中的字符?
所以这个问题的背景是这样的:我们有几个应用程序通过套接字相互通信并与客户的应用程序通信。这些套接字消息包含不可打印的字符(例如 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 是一整天最慢的方法。)
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。
所以我对所有人的问题是:我可以让它更快吗?我错过了什么?