¿Es fácil para escanear el código de bytes para llamadas a funciones e inyectar llamadas a de arranque/parada del temporizador?
¿O es realmente difícil y es por eso que personas pagan herramientas para hacer esto?
Inyectar las llamadas es tan difícil que se necesitan herramientas para hacerlo.
No solo es difícil, es una forma muy indirecta de encontrar cuellos de botella. La razón es que un cuello de botella es una o una pequeña cantidad de declaraciones en su código que son responsables de un buen porcentaje de tiempo que se gasta, tiempo que podría reducirse significativamente, es decir, no es realmente necesario, es decir, es un desperdicio. SI puede indicar el tiempo medio de inclusión de una de sus rutinas (incluido el tiempo de IO), y SI puede multiplicarlo por cuántas veces se ha llamado, y dividir por el tiempo total, puede decir en qué porcentaje de tiempo toma de rutina Si el porcentaje es pequeño (como 10%) es probable que tenga problemas más grandes en otro lugar. Si el porcentaje es mayor (como 20% a 99%), podría tener un cuello de botella dentro de la rutina. Así que ahora tiene que cazar dentro de la rutina para ello, mirando las cosas que llama y cuánto tiempo toman tomar. También quiere evitar confundirse con la recursión (el bugaboo de los gráficos de llamadas).
Hay perfiladores (como Zoom para Linux, Shark, & otros) que funcionan en un principio diferente. El principio es que hay una pila de llamadas a funciones, y durante todo el tiempo que una rutina es responsable (ya sea de trabajar o esperar que otras rutinas hagan el trabajo que solicitó) es en la pila. Entonces, si es responsable del 50% del tiempo (por ejemplo), esa es la cantidad de tiempo que está en la pila, independientemente de cuántas veces se haya llamado o cuánto tiempo tomó por llamada. No solo está la rutina en la pila, sino que las líneas específicas de código que cuestan el tiempo también están en la pila. No necesita buscarlos. Otra cosa que no necesita es precisión de medición. Si tomó 10,000 muestras de pila, las líneas culpables se medirán a 50 +/- 0.5 por ciento. Si tomó 100 muestras, se medirían como 50 +/- 5 por ciento. Si tomó 10 muestras, se medirían como 50 +/- 16 por ciento. En todos los casos los encuentra, y ese es su objetivo. (Y la recursividad no importa. Todo lo que significa es que una línea determinada puede aparecer más de una vez en una muestra de pila determinada)
Sobre este tema, hay mucha confusión. En cualquier caso, los perfiladores que son más efectivos para encontrar los cuellos de botella son los que toman muestras de la pila, en la hora del reloj de pared e informan el porcentaje por línea. (Esto es fácil de ver si cierta myths about profiling se ponen en perspectiva.)
espero a Jon Skeet. –
Este artículo tiene mucha información buena: http://msdn.microsoft.com/en-us/magazine/cc301725.aspx. También http://msdn.microsoft.com/en-us/library/bb384547.aspx –
En general, muchos perfiladores toman instantáneas muy frecuentes de la pila para ver dónde se encuentra actualmente. Luego construyen estadísticas usando esas instantáneas. Por supuesto, existe la clara posibilidad de que este no sea el caso con C#, así que tómalo con un grano de sal. –