¿Qué tan rápido puedo reemplazar caracteres en una cadena?Reemplazo de caracteres en cadenas en VB.NET
El trasfondo de esta pregunta es este: tenemos un par de aplicaciones que se comunican entre sí y con las aplicaciones de los clientes a través de sockets. Estos mensajes de socket contienen caracteres no imprimibles (por ejemplo, chr (0)) que necesitan ser reemplazados por una cadena predeterminada (por ejemplo, "{Nul}"}, porque los mensajes de socket se guardan en un archivo de registro. En una nota lateral, no cada mensaje de registro tendrá que tener caracteres reemplazados.
Ahora se ubicó en esta pequeña aventura de lectura de this MSDN link que encontré de un puesto diferente de este sitio.
el método actual se utilizó en el ... principio del día ... estaba usando StringBuilder para buscar todos los reemplazos posibles, como ...
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
Ahora, como indica la publicación del blog, dejar StringBuilder fuera y usar string.replace produce resultados más rápidos. (En realidad, el uso de StringBuilder era el método más lento de hacer esto durante todo el día.)
p_Message = p_Message.Replace(Chr(0), "{NUL}")
p_Message = p_Message.Replace(Chr(1), "{SOH}")
Sabiendo que no necesitaría cada mensaje que pasar por este proceso que pensé que sería ahorrar tiempo al no tener que procesar esos mensajes que podría ser dejado afuera. Entonces, al usar expresiones regulares, primero busqué la cadena y luego determiné si necesitaba ser procesada o no. Esto era más o menos lo mismo que usar el string.replace, básicamente un lavado al guardar el tiempo de no procesar todas las cadenas, pero perder tiempo de revisarlas todas con expresiones regulares.
Luego se sugirió probar el uso de algunas matrices que coinciden con sus índices con las antiguas y las nuevas y usarlas para procesar los mensajes. Entonces sería algo como esto ...
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
Hasta ahora, esta ha sido la forma más rápida que he encontrado para procesar estos mensajes. He intentado varias otras formas de resolver esto, así como convertir la cadena entrante en una matriz de caracteres y compararla con también intentar recorrer la cadena en lugar de chrArray.
Así que mi pregunta a todos es: ¿Puedo hacer esto más rápido? ¿Qué me estoy perdiendo?
Si usted tiene la opción de utilizar C#, que podría ser capaz de escribir una función perversamente rápido con código no seguro. – Juliet
Me había preguntado si eso hubiera sido posible, pero pronto conté esa opción debido a los parámetros que me dieron para trabajar con ... oh bien – Tim