bien - ¡hora de la nueva verdad!
Esta fue una prueba para cualquier carácter en mayúscula de una cadena.
Se garantizó que la cadena no tenía caracteres en mayúscula dentro de los primeros 60K de caracteres. (Creé la cadena de random.org)
Evité la optimización de sustitución de cadenas en el compilador aleatorizando qué cadena de caracteres de 64K se pasó a la función de prueba.
Todos los tiempos eran muy estrictos con respecto a la prueba real, y no incluían el tiempo de llamadas a funciones.
Corrí la prueba una vez, 10 veces, y de nuevo por 10.000 veces y un promedio de cada conjunto de las temporizaciones para cada prueba.
que corrió la prueba en una de 64 bits de Windows 7 con i3-2100 CPU @ 3.1 Ghz
caso de prueba 1:
static bool testCaseOne(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
result = !string.IsNullOrEmpty(str) && str.Any(c => char.IsUpper(c));
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
Resultando tiempo promedio:
- 1 X = 3,000 ms
- 10 x = 0.860 ms
- 10,000 x = 0.821 ms
caso de prueba 2:
static bool testCaseTwo(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
result = Regex.IsMatch(str, "[A-Z]");
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
resultantes tiempo promedio:
- 1 x = 2.000 ms
- 10 x = 1.597 ms
- 10.000 x = 1.603 ms
caso de prueba 3:
static bool testCaseThree(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
for (int i = 0; i < str.Length; i++)
{
if (char.IsUpper(str[i]))
{
result = true;
break;
}
}
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
resultante tiempo promedio:
- 1 x = 1.000 ms
- 10 x = 0,357 ms
- 10.000 x = 0,298 ms
Prueba Caso 4:
static bool testCaseFour(string str, out double ms)
{
bool result = false;
DateTime start = DateTime.Now;
if (string.IsNullOrEmpty(str))
{
ms = 0;
return false;
}
for (int i = 0; i < str.Length; i++)
{
if (str[i] > 64 && str[i] < 91)
{
result = true;
break;
}
}
ms = (DateTime.Now - start).TotalMilliseconds;
return result;
}
}
resultante tiempo promedio:
- 1 x = 0,000 ms
- 10 x = 0,137 ms
- 10.000 x = 0,184 ms
interesante.
espero que este statisfies Sr. RK;)
Lo consideraría "lo suficientemente rápido". – BoltClock
Creo que es un buen enfoque, podría usar LINQ para hacer el trabajo del bucle for, pero el código generado sería equivalente. También podría probar que la cadena original no es igual a la cadena convertida a minúscula, pero espero que sea menos eficiente ya que siempre requerirá una poligonal completa de la cadena. – Clayton
Puede haber algunos problemas de rendimiento con el uso de LINQ en lugar de un for-loop – VisualBean