Muchos de los perfiladores son así. Lo que necesita saber no es donde el programa pasa su tiempo, pero por qué. Any references on Dynamic Code Analysis?
AÑADIDOS: Here's how Encuentro "cuellos de botella" en mi código. (Odio esa palabra.) Here's a list de razones por las cuales.
Es perfectamente natural suponer que para encontrar "cuellos de botella" de alguna manera debe medir mucho. Es tan natural que casi todos los perfiladores se basan en él.
En realidad, encontrar y medir no es el mismo problema. La medición es necesaria para ver si lo que encontraste (y lo reparaste) marcó la diferencia. Encontrar lo que hay que arreglar, para mí, es más como depurar que medir.
La forma más simple de explicarlo es comenzar desde un ciclo infinito o casi infinito. ¿Cómo lo encuentras? Pausa y mira la pila, ¿verdad? porque sabes que el problema está en algún lugar de la pila. Solo necesita detenerlo una vez, y luego debe estudiar el código en la pila. Pausa algunas veces si quieres estar seguro de haberlo encontrado.
Supongamos que el código solo tarda el doble de tiempo que el necesario. Eso significa que cuando lo detenga, hay un 50% de posibilidades de que lo vea haciendo algo innecesario. Si lo pausa y lo mira 10 veces, lo captará en el acto aproximadamente 5 veces. De hecho, tan pronto como lo veas haciendo algo que puedes optimizar en tan solo 2 muestras, has encontrado un "cuello de botella". Solucionarlo, medir la aceleración, mostrarlo y repetir.
Incluso si su mayor problema no es muy grande, este método finalmente lo encontrará. Además, hay un fenómeno de ampliación, donde los pequeños problemas se vuelven más fáciles de encontrar después de eliminar los más grandes. Eso te permite seguir hasta que el código sea casi óptimo.
P.S. Después de haber hecho esto, aún puede haber oportunidades para acelerar. Por ejemplo, los algoritmos de optimización pueden depender de la estabilidad numérica. Las arquitecturas basadas en mensajes pueden dificultar el rastreo del código que se está ejecutando. En el software en tiempo real, un problema de rendimiento solo puede ocurrir ocasionalmente y ser menos fácil de muestrear. Esto requiere más inteligencia. Volver a simplemente medir no lo hace.
¿Está teniendo los mismos problemas que tenía en [¿Es posible ignorar los métodos irrelevantes al perfilar ruby applications?] (http://stackoverflow.com/questions/2241491/is-it-possible-to-ignore-irrelevant-methods-when-profiling-ruby-applications). Descubrí la opción de eliminación del método de ruby-prof. –