I utiliza la fuente en esta página como un ejemplo, que entonces duplicado el contenido 8 veces, resultando en una página algunos 334.312 bytes de longitud. Usar StringComparision.Ordinal produce una diferencia de rendimiento masiva.
string newInput = string.Format("{0}{0}{0}{0}{0}{0}{0}{0}", input.Trim().ToLower());
//string newInput = input.Trim().ToLower();
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int[] _exclStart = new int[100];
int[] _exclStop = new int[100];
int _excl = 0;
for (int f = newInput.IndexOf("<script", 0, StringComparison.Ordinal); f != -1;)
{
_exclStart[_excl] = f;
f = newInput.IndexOf("</script", f + 8, StringComparison.Ordinal);
if (f == -1)
{
_exclStop[_excl] = newInput.Length;
break;
}
_exclStop[_excl] = f;
f = newInput.IndexOf("<script", f + 8, StringComparison.Ordinal);
++_excl;
}
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
correr 5 veces produce casi el mismo resultado para cada uno (los tiempos de bucle no cambió significativamente por lo que para este código simple que casi no hay tiempo para JIT compilarlo)
de salida usando el original código (en milisegundos):
10.2786
11.4671
11.1066
10.6537
10.0723
salida utilizando el código de seguridad en su lugar (en milisegundos):
0.3055
0.2953
0.2972
0.3112
0.3347
en cuenta que los resultados de mis pruebas son alrededor de 0,010 segundos (código original) y 0,0003 segundos (para el código ordinal). Lo que significa que tienes algo más equivocado aparte de este código directamente.
Si, como dice, utilizar StringComparison.Ordinal
no significa nada para su rendimiento, significa que utiliza temporizadores incorrectos para medir el tiempo o tiene una gran sobrecarga al leer su valor input
, como leerlo de nuevo de una secuencia que de lo contrario no te das cuenta.
Probado en Windows 7 x64 ejecutándose en un 3GHz i5 utilizando .NET 4 Client Profile.
Sugerencias:
- uso
StringComparison.Ordinal
- Asegúrese de que está utilizando
System.Diagnostics.Stopwatch
de rendimiento en tiempo
- declara una variable local para el
input
en lugar de utilizar los valores externos a la función (por ejemplo: string newInput = input.Trim().ToLower();
)
Nuevamente, recalco, obtengo 50 veces más rápido velocidad para datos de prueba aparentemente más de 4 veces más grandes utilizando exactamente el mismo código que usted proporciona. Lo que significa que mi prueba se está ejecutando unas 200 veces más rápido que la tuya, que no es algo que nadie esperaría dado que ambos estamos ejecutando el mismo entorno y solo i5 (me) versus i7 (usted).
intente utilizar la expresión regular que se compila –
Tengo que adivinar que * la entrada * es en realidad una propiedad que es muy costosa de recuperar. Hacer una copia. –
de entrada es una cadena que ya está allí. Tiene más de 74,000 caracteres. No hay una penalización de perf por retirarlo. – Ghostrider