Tengo un método para reemplazar todos los caracteres excepto los que especifico. Por ejemplo,Inverse String.Replace - ¿Forma más rápida de hacerlo?
ReplaceNot("test. stop; or, not", ".;/\\".ToCharArray(), '*');
regresarían
"****.*****;***,****".
Ahora, esto no es una instancia de la optimización prematura. Llamo a este método varias veces durante una operación de red. Descubrí que en cadenas más largas, está causando cierta latencia, y eliminarlo ayudó un poco. Cualquier ayuda para acelerar esto sería apreciada.
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
int old = -1;
StringBuilder sb = new StringBuilder(original.Length);
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb.Append(new string(replacement, index - old - 1));
sb.Append(original[index]);
old = index++;
}
if (original.Length - old > 1)
{
sb.Append(new string(replacement, original.Length - (old + 1)));
}
return sb.ToString();
}
Final # 's. También agregué un caso de prueba para una cadena de caracteres de 3K, ejecuté 100K veces en vez de 1M para ver qué tan bien cada una de estas escalas. La única sorpresa fue que la expresión regular 'escaló mejor' que los otros, pero no es de ayuda, ya que es muy lento para empezar:
User Short * 1M Long * 100K Scale John 319 2125 6.66 Luke 360 2659 7.39 Guffa 409 2827 6.91 Mine 447 3372 7.54 DirkGently 1094 9134 8.35 Michael 1591 12785 8.04 Peter 21106 94386 4.47
actualización: Hice la creación de la expresión regular para la versión de Peter una variable estática, y la puso a RegexOptions.Compiled para ser justos:
User Short * 1M Long * 100K Scale Peter 8997 74715 8.30
Pastebin enlace a mi código de prueba, por favor, corríjanme si está mal: http://pastebin.com/f64f260ee
Una nit: por favor cambie 'pattern.Contains (original [i]) == false? reemplazo: original [i] 'to' pattern.Contains (original [i])? original [i]: reemplazo'. No es necesario comparar una expresión de bool a verdadero/falso y generalmente se considera mala forma. –
He realizado pruebas de velocidad para todas estas versiones, y su edición más reciente es en realidad la más lenta de todas, ¿cómo obtiene los resultados 4 veces más rápido? –
@john, los vuelvo a verificar, con la esperanza de no estropear algo como volver a cargar una página web mientras realizo la prueba :) – esac