2010-05-24 11 views
5

¿Algún cuerpo conoce el generador de perfiles C como gprof que da tiempos de llamada de función en microsegundos en lugar de milisegundos?perfilador de microsegundos para el código C

+0

Y lo necesito para trabajar en Ubuntu, y ser un programa gratuito. – godot101

+0

¿Está preguntando porque quiere saber qué puede cambiar para que tome menos tiempo? –

+0

@Mike: Quiero saber cuánto tiempo tarda mi código C en ejecutarse, y la precisión en milisegundos que proporciona gprof a partir de ahora no es suficiente ya que todo mi código se ejecuta en unos pocos ms. Por lo tanto, necesito una mayor precisión por el tiempo empleado en cada llamada de función. – godot101

Respuesta

3

Eche un vistazo a Linux perf. Sin embargo, necesitarás un kernel bastante reciente.

3

Permítanme solo sugerir cómo manejaría esto, suponiendo que tenga el código fuente.

Saber cuánto tiempo una función toma inclusive por invocación (incluyendo E/S), en promedio, multiplicado por el número de invocaciones, dividido por el tiempo total de ejecución, le daría la fracción de tiempo bajo el control de esa función. Esa fracción es cómo sabes si la función es una toma de tiempo suficiente para molestar a la optimización. No es información fácil de obtener desde gprof.

Otra forma de saber qué fracción del tiempo de inclusión se utiliza bajo el control de cada función es el tiempo o el muestreo aleatorio de la pila de llamadas. Si aparece una función en una fracción X de las muestras (incluso si aparece más de una vez en una muestra), entonces X es la fracción de tiempo que toma (dentro de un margen de error). Lo que es más, esto le da por línea fracción de tiempo, no solo por función.

Esa fracción X es la información más valiosa que puede obtener, porque esa es la cantidad total de tiempo que podría ahorrar optimizando esa función o línea de código.

La Zoom profiler es una buena herramienta para obtener esta información.

Lo que haría sería enrollar un bucle de larga duración alrededor del código de nivel superior, para que se ejecute repetidamente, lo suficiente como para tardar al menos varios segundos. Luego, samplearía manualmente la pila al interrumpirla o pausarla al azar. En realidad, se necesitan muy pocas muestras, como 10 o 20, para obtener una imagen realmente clara de las funciones y/o líneas de código que consumen más tiempo.

Here's an example.

P. S. Si le preocupa la precisión estadística, permítame ser cuantitativo. Si una función o línea de código está en la pila exactamente el 50% del tiempo, y toma 10 muestras, entonces el número de muestras que lo muestran será 5 +/- 1.6, para un margen de error de 16%. Si el tiempo real es más pequeño o más grande, el margen de error se reduce. También puede reducir el margen de error tomando más muestras. Para obtener 1.6%, toma 1000 muestras. En realidad, una vez que haya encontrado el problema, depende de usted decidir si necesita un margen de error menor.

1

oprofile le consigue tiempos en la resolución del reloj, es decir nanosegundos, produce archivos de salida compatibles con gprof por lo que es muy cómodo de usar.

http://oprofile.sourceforge.net/news/

2

gprof da resultados, ya sea en milisegundos o en microsegundos. No conozco el razonamiento exacto, pero mi experiencia es que mostrará resultados en microsegundos cuando cree que hay suficiente precisión para ello. Para obtener una salida de microsegundos, necesita ejecutar el programa por más tiempo y/o no tiene ninguna rutina que tome demasiado tiempo para ejecutarse.

Cuestiones relacionadas