c# - ¿Cuál es la mejor manera de comparar programas en Windows?
.net performance (6)
Necesito hacer algunos benchmarks de rendimiento en programas .NET (C #) en Windows, pero no he hecho benchmarking mucho en el mundo de Windows. He buscado utilizar el monitor de rendimiento de Windows 2000 / XP con contadores personalizados para esto, pero no creo que esto sea exactamente lo que quiero.
¿Hay alguna buena instalación de sistema para esto en Windows XP, o solo necesito usar System.Diagnostics.Stopwatch [edit] y escribir registros de texto para la interpretación manual, o hay algo más?
Editar: ¿hay algo más allá de System.Diagnostics.Stopwatch
?
using System.Diagnostics;
....
Stopwatch sw = new Stopwatch();
sw.Start();
// Code you want to time...
// Note: for averaged accuracy (without other OS effects),
// run timed code multiple times in a loop
// and then divide by the number of runs.
sw.Stop();
Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks");
Puede que esto no sea lo que quiere, pero dotTrace ofrece muchos diagnósticos útiles y está integrado en Visual Studio.
Para micro-benchmarking me gusta mucho MeasureIt (se puede descargar de http://msdn.microsoft.com/en-us/magazine/cc500596.aspx ). Es un proyecto de prueba escrito por Vance Morrison, un arquitecto de rendimiento en el CLR. Actualmente tiene un buen conjunto de puntos de referencia para varios métodos centrales de .Net / CLR. La mejor parte es que es trivial modificar y agregar nuevos puntos de referencia para lo que quieras probar. Simplemente ejecute "MeasureIt / edit" y lanzará VS con el proyecto por sí mismo para que pueda ver cómo se escriben esos puntos de referencia y agregar nuevos de manera similar si lo desea.
Como ya se ha dicho, StopWatch es probablemente la forma más fácil de hacerlo y MeasureIt utiliza StopWatch para sus tiempos, pero también hace otras cosas como ejecutar un bloque de código X veces y luego proporcionar estadísticas de las ejecuciones y otras.
Si desea solo algunos números rápidos, puede usar Powershell para cronometrar la ejecución general. Use el cmdlet measure-command. Es más o menos equivalente a "tiempo" en Unix.
> measure-command { your.exe arg1 }
Days : 0
Hours : 0
Minutes : 0
Seconds : 4
Milliseconds : 996
Ticks : 49963029
TotalDays : 5.78275798611111E-05
TotalHours : 0.00138786191666667
TotalMinutes : 0.083271715
TotalSeconds : 4.9963029
TotalMilliseconds : 4996.3029
Si su proyecto es bastante grande y hay muchos módulos haciendo una gran cantidad de llamadas, puede hacer lo siguiente: http://www.moduleanalyzer.com/
Hay bastantes perfiladores por ahí. Estos son algunos de los que conozco:
Si continúa utilizando System.Diagnostics.Stopwatch, podrá instrumentar y medir solo puntos particulares de su código, donde pone explícitamente el Start / Stop. Esto es lo suficientemente bueno para medir piezas específicas, como un ciclo cerrado o cosas por el estilo, pero no le dará una idea completa de dónde pasa su programa la mayor parte del tiempo.