Pregunta

Mientras que la pregunta comprobar si la entrada es el tipo de cadena Se ha cerrado, dos de las respuestas generaron una pregunta sobre microoptimización en mi mente:¿Cuál de las dos soluciones siguientes funcionaría mejor?

Reed Copsey proporcionó un solución usando Char.IsLetter:

string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );

Adaptado solución usando expresiones regulares de Marcos Byers:

string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);

Como no quería simplemente hacer la pregunta a Reed o Mark, pensé en escribir una prueba rápida para determinar cuál funcionó mejor.El problema es que no he optimizado mucho el código (tiendo a poner la legibilidad del código por encima de todo).

Además de tomar una marca de tiempo antes y después de la ejecución de cada uno, ¿cuáles son otras opciones (¿mejores?) para determinar qué solución se ejecuta más rápido?

Editar

Yo modifiqué la respuesta de martin trabajar con Console.WriteLine(...) y lo ejecuté como una aplicación de consola.No estoy seguro exactamente cómo LinqPad ejecuta aplicaciones pero los resultados fueron más o menos los mismos:

41
178
¿Fue útil?

Solución

Querrá hacer esto, medir los tiempos de ejecución utilizando un Cronómetro .Además, aquí hay algunas cosas muy importantes que deben tener en cuenta cuando se perfile:

  1. siempre ejecuta su prueba más de 1 vez.La primera vez que lo ejecuta, habrá sobrecarga del JIT, y los tiempos pueden ser engañosos.Ejecutar muchas veces y tomar el promedio es un buen enfoque (a menudo ejecutaré una prueba como esta 100,000 veces, por ejemplo.)
  2. Siempre ejecute su prueba con una construcción completa de lanzamiento, fuera del proceso de alojamiento de Visual Studio.(De forma predeterminada, puede usar CTRL + F5 para esto). El host Visual Studio impacta drásticamente los tiempos.

Otros consejos

deberías revisar System.Diagnostics.Stopwatch!

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Debes ejecutarlo muchas veces en un bucle para reducir los errores de sincronización y otros factores incontrolables.

Espero que ayude.

Acabo de poner esto juntos en linqpad como ejemplo de cómo lo haría (de ahí elLlamadas a volcado (): Reemplace con Console.Writeline (...) si no está usando esta herramienta útil).

Parece que el Linq Way es ligeramente más que cuatro veces más rápido:

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string myString = "RandomStringOfLetters";
 bool allLetters = myString.All( c => Char.IsLetter(c) );
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

stopwatch.Reset();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string s = "RandomStringOfLetters";
 bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

Salida:

47 
196

Hay un sistema.diagnostics.stopWatch Class que se puede utilizar.

CUALQUIER Código que prueba, ejecute la prueba una vez para eliminar los costos de JIT y luego ejecutarlo nuevamente para los tiempos finales.La mayoría de los recuentos de tiempo individuales podrían ser imprensativos debido a otros factores en la PC, así que ejecute muchas iteraciones y luego calcule el tiempo de ejecución promedio de ese.

Utilice el sistema.diagnostics.stopWatch Class.

Inicie el cronómetro y ejecute varios miles de iteraciones, detenga y verifique el total de milisegundos que han transcurrido

Pasos para determinar cuál es más rápido: -

  1. Obtenga una colección de computadoras, un par de cientos deben hacer, AMD / Intel / Otro, 32 bits / 64 bits, ...

  2. Instale cada marco .NET que le importa en cada uno de ellos (a su vez)

  3. Pruebe cada combinación de opciones de optimización para la compilación (a su vez)

  4. Use el cronómetro para probar una carrera grande para cada

  5. Monitoreo de la utilización de la memoria para cada uno de los cuales puede tener un mayor impacto en el resto de su solicitud.Ahorrar algunos ciclos al costo del aumento del consumo de memoria y más la actividad de recolección de basura es a menudo una "optimización" deficiente.

  6. que podría darle una idea de cuál es más rápido en la práctica, al menos para las versiones actuales del compilador.Repita con cada nueva versión del compilador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top