替换字符串中的字符的速度有多快?
所以这个问题的背景是这样的:我们有几个应用程序,它们通过套接字相互通信以及与客户端应用程序通信。这些套接字消息包含不可打印的字符(例如 chr(0)),需要用预定的字符串(例如“{Nul}”}替换,因为套接字消息保存在日志文件中。顺便说一句,不是每条日志消息都需要替换字符。
现在我开始了这个小小的冒险阅读这个 MSDN 链接 http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/04/02/comparing-regex-replace-string-replace-and-stringbuilder-replace-which-has-better-performance.aspx?PageIndex=2#comments我从这个网站的另一篇文章中找到了它。
我们当前使用的方法...在当天开始时...正在使用 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。
所以我对所有人的问题是:我可以让这个更快吗?我缺少什么?