the statistical learning c profiling profiler

statistical - hclust methods



¿Recomendaciones para C Profilers? (6)

Todo el mundo siempre dice que el perfil de su programa antes de realizar optimizaciones, pero nadie describe cómo hacerlo.

¿Cuáles son sus prácticas para perfilar el código C?


Por el bien de completar, agregaría oprofile . Es especialmente interesante si quiere comparar el kernel.


Shark / Instruments (usando dtrace) son los perfiladores disponibles en una Mac. Ellos son bastante buenos.


Si está utilizando Linux, entonces recomiendo la combinación de ValGrind y CallGrind y KCacheGrind . ValGrind es un excelente método para encontrar fugas de memoria, y la extensión CallGrind lo convierte en un buen generador de perfiles.

NOTA : Acabo de learned que ValGrind ahora también funciona en Mac OSX. Sin embargo, CallGrind y KCacheGrind no se han actualizado desde 2005. Es posible que desee ver otros front-ends .



Me alegro de que me hayas preguntado :-) Si no te importa lo contrario, mira estas respuestas:

Déjame intentar ponerlo en pocas palabras:

  1. ¿El programa te espera o esperas? Si no te hace esperar, entonces no tienes un problema, así que déjalo en paz.

  2. Si te hace esperar, entonces continúa.

Recomiendo el muestreo, que es obtener radiografías estroboscópicas de lo que el programa está haciendo cuando está ocupado (no esperando por ti). Obtenga muestras al menos de la pila de llamadas, no solo del contador del programa. Si solo obtiene muestras del contador del programa, no tendrá sentido si su programa pasa mucho tiempo en E / S o en las rutinas de la biblioteca, así que no se conforme con eso.

Si desea obtener muchas muestras, necesita un generador de perfiles. Si solo necesita unos pocos, el botón de pausa en el depurador funciona bien. En mi experiencia, 20 es más que suficiente, y 5 es a menudo suficiente.

¿Por qué? Supongamos que tiene 1000 muestras de la pila de llamadas. Cada muestra representa una porción del tiempo del reloj de pared que se está gastando solo porque cada línea de código en la pila lo solicitó . Entonces, si hay una línea de código que aparece en 557 muestras de 1000, puede asumir que es responsable de 557/1000 del tiempo, dar o tomar algunas muestras (15). Eso significa que, si todo el tiempo de ejecución le costó $ 100, esa línea en sí misma está costando $ 55.70, más o menos $ 1.50 **, por lo que debe ver si realmente la necesita.

¿Pero necesitas 1000 muestras? Si esa línea cuesta alrededor del 55.7% del tiempo, entonces si solo tomó 10 muestras, la vería en 6 de ellas, daría o tomaría 1.5 muestras. Entonces, si ve una declaración en 6 de cada 10 muestras, sabe que le está costando aproximadamente entre $ 45 y $ 75 de esos $ 100. Incluso si solo le cuesta $ 45, ¿no le gustaría ver si realmente lo necesita?

Es por eso que no necesita muchas muestras, no necesita mucha precisión. Lo que sí necesitas es lo que las muestras de pila te dan: te apuntan precisamente a las líneas más valiosas para optimizar.

** La desviación estándar del número de muestras es sqrt( f * (1-f) * nsamp ) donde f es la fracción de muestras que contiene la línea.


Usando gcc , compilo y -pg con -pg (como se explica, por ejemplo, here ), luego continúo ejecutando el programa (de acuerdo con los principios también sugeridos en esa URL) y usando gprof . Las herramientas variarán si usa diferentes compiladores & c, pero la URL aún se recomienda, incluso entonces, para las partes que tratan sobre ideas generales sobre cómo y por qué crear un perfil de su código.