Profiling .NET aplicaciones con cronómetro

Parece que no hay perfiladores de rendimiento * .NET gratuitos que puedan perfilarse línea por línea. Por lo tanto, estoy buscando usar el cronómetro para la creación de perfiles.

* gratis como en libertad, es decir, la licencia incluye aplicaciones comerciales.

EDIT: En respuesta a quienes 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 he tenido mucha suerte. Esta pregunta se basa principalmente en la curiosidad. Nunca consideraría el cronómetro como un reemplazo para un perfilador real.

Tengo una pequeña aplicación de prueba (escrita en C #) que mide las diferencias de rendimiento cuando uso un cronómetro por línea. El código de prueba es este:

int n = 100;
BigInteger f = 1;
for (int i = n; i > 1; i--)
{
    f *= i;
}

Aquí está el código completo:http: //pastebin.com/AvbQmT3

Tengo un cronómetro para cada línea de código. Este es mi 'perfilador'. También tengo un cronómetro para todo el programa. Este es mi 'profiler profiler'.

Tengo el programa configurado como modo de lanzamiento, cualquier CPU (en una máquina x64) y optimizaciones deshabilitadas.

Cuando ejecuto el programa con el generador de perfiles deshabilitado, obtengo algo como esto:

             Line             |  Ticks
------------------------------|----------
                              |
Total time:                   |       359

Cuando lo ejecuto con el generador de perfiles habilitado, obtengo 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 necesitar perfilar cada línea de un programa, ya que generalmente funciona mejor con un enfoque de divide y vencerás. Por lo general, puede comenzar perfilando fragmentos de código y reducir 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 gastos generales del cronómetro.

in embargo, todavía hay gastos generales cuando se usan cronómetros, especialmente si se usa mucho.

Así que a la pregunta:

¿Cuál es la forma más efectiva de usar cronómetros para la creación de perfiles? ¿Cómo puedo minimizar los gastos generales? ¿Vale la pena incluir un cronómetro en una sola declaración?

Agradezco tus comentarios.

Respuestas a la pregunta(14)

Su respuesta a la pregunta