Parece que no hay perfiles de rendimiento * .NET gratuitos que puedan perfilar línea por línea. Por lo tanto, estoy buscando usar Cronómetro para perfilar.Creación de perfiles de aplicaciones .NET con Cronómetro
* gratis como en libertad, es decir, la licencia incluye aplicaciones comerciales.
EDITAR: En respuesta a los que me dijeron "compre un perfilador", me gustaría, pero si pudiera gastar tanto dinero, lo gastaría en otra cosa. Traté de convencer a mi jefe de que un perfilador lo vale, pero no tuve mucha suerte. Esta pregunta se basa principalmente en la curiosidad. Nunca consideraría a Cronómetro como un reemplazo para un generador de perfiles real.
Tengo una pequeña aplicación de prueba (escrita en C#) que mide las diferencias de rendimiento cuando se usa un cronómetro por línea. El código de prueba es la siguiente:
int n = 100;
BigInteger f = 1;
for (int i = n; i > 1; i--)
{
f *= i;
}
Aquí está el código completo: http://pastebin.com/AvbQmT32
Tengo un cronómetro para cada línea de código. Este es mi 'generador de perfiles'. También tengo un cronómetro para todo el programa. Este es mi 'profiler profiler'.
Tengo el programa configurado como Modo de liberación, Cualquier CPU (en una máquina x64) y las optimizaciones están deshabilitadas.
Cuando ejecuto el programa con el perfilador desactivado, me sale algo como esto:
Line | Ticks
------------------------------|----------
|
Total time: | 359
Cuando corro con activar el generador de perfiles, me sale algo como esto:
Line | Ticks
------------------------------|----------
|
int n = 100; | 3
BigInteger f = 1; | 12
for (int i = n; i > 1; i--) | 325
{ |
f *= i; | 539
} |
|
Total time: | 1710
Stopwatch overhead: | 831
Idealmente , el tiempo dedicado al código debe ser igual en ambos casos, pero parece que los cronómetros tienen una sobrecarga que aparece dentro de su propio tiempo transcurrido.
Ahora, a menudo no tiene sentido tener que perfilar cada línea de un programa, ya que generalmente funciona mejor con un enfoque de dividir y vencer. Por lo general, puede comenzar describiendo trozos de código y reduciendo cualquier problema de rendimiento.
Además, en la mayoría de las aplicaciones, la línea de código promedio será mucho más lenta que las del programa de prueba. Esto significa que habrá menos sobrecarga del cronómetro.
Sin embargo, todavía hay sobrecarga al usar los Cronómetros, especialmente si usa mucho.
Así reduce a la pregunta:
Cuál es la forma más eficaz de utilizar cronómetros para el perfilado? ¿Cómo puedo minimizar la sobrecarga? ¿Vale la pena envolver un cronómetro alrededor de una sola declaración?
Les agradezco su comentario.
Personalmente, los perfiladores que compré (ANTS Profiler) valieron cada centavo. Nunca volvería a pensar en el perfil "manual" de nuevo. –
Lo siento por preguntar, pero ¿por qué no utilizar algunas de las clases System.Diagnostics? Creo que contiene clases para ver el uso de CPU y Ram, por ejemplo. – Eon
La versión gratuita de Eqatec Profiler permite su uso en un proyecto comercial: http://www.eqatec.com/Profiler/LicenseTerms.aspx – ken2k