2009-01-20 10 views
19

Mientras estaba trabajando en un proyecto de la Universidad, utilicé un generador de perfiles interno del proyecto hecho por un alumno mayor, era muy básico pero lo suficientemente bueno ya que su tarea era restar tiempos entre dos puntos del código y dar estadísticas.¿Cómo funcionan los perfiladores de código?

Ahora, ¿cómo funciona un perfilador profesional? ¿Preprocesa el código para insertar puntos de control o cosas así? ¿Lee el código binario con datos de depuración para detectar dónde se llama una función?

Gracias.

Respuesta

22

Hay muchos perfiles diferentes que funcionan de diferentes maneras.

Los perfiladores de uso común simplemente examinan el programa en ejecución regularmente para ver qué instrucción de ensamblaje se está ejecutando actualmente (el contador del programa) y qué rutinas llaman a la función actual (la pila de llamadas). Este tipo de generador de perfiles de muestreo puede trabajar con binarios estándar, pero son más útiles si tiene símbolos de depuración para resolver líneas de código de direcciones dadas en el programa.

Además de muestrear regularmente, también puede utilizar los contadores de rendimiento del procesador para muestrear después de un cierto número de eventos como fallas de caché, que le ayudarán a ver qué partes de su programa se están desacelerando debido a los accesos a la memoria.

Otros perfiladores implican volver a compilar el programa para insertar instrucciones (conocido como instrumentación) para contar con qué frecuencia se ejecuta cada conjunto continuo de instrucciones (bloques básicos), o tal vez incluso grabar la secuencia en la que se ejecutan los bloques básicos, o registrar el contenido de las variables en ciertos lugares.

El enfoque de la instrumentación puede darle toda la precisión y los datos que pueda desear, pero ralentizará el programa y eso cambiará sus características de rendimiento. Por el contrario, con los enfoques basados ​​en el muestreo, puede ajustar el impacto en el rendimiento en función del tiempo que necesita para ejecutar el programa en comparación con la precisión de los datos de perfil que obtiene.

2

Depende del tipo de código analizado, por ejemplo .NET CLR proporciona facility para los analizadores de código. Cuando se trata de código administrado, es posible reescribir el código intermedio para inyectar ganchos personalizados. También puedes analizar el seguimiento de la pila de las aplicaciones. El sistema operativo puede proporcionar medios para crear perfiles, por ejemplo, Windows tiene performance counters. Al tratar con el código incrustado, puede emular/sustituir el hardware subyacente para monitorear efectivamente el rendimiento del sistema.

+0

¿Qué quiere decir con "código administrado"? – tunnuz

+0

http://en.wikipedia.org/wiki/Managed_code – aku

13

Existen dos estrategias de creación de perfiles comunes (para los lenguajes basados ​​en VM de todos modos): instrumentación y muestreo.

La instrumentación inserta puntos de control e informa al generador de perfiles cada vez que se inicia y finaliza un método. Esto puede hacerlo el JIT/intérprete o una fase posterior a la compilación normal pero previa a la ejecución que simplemente cambia el ejecutable. Esto puede tener un efecto muy significativo en el rendimiento (lo que sesga los resultados de sincronización). Sin embargo, es bueno para obtener recuentos precisos.

El muestreo le pregunta a la VM periódicamente cómo se ve la traza de la pila para todos los hilos, y actualiza sus estadísticas de esa manera. Esto generalmente afecta el rendimiento menos, pero produce recuentos de llamadas menos precisas.

+1

IMO, el mejor método es capturar un menor número de trazas de pila. Luego, para cada stmt/instr sobre ellos, informe el% de muestras que lo contienen. Los mejores puntos para examinar están en esa lista, incluso si las estimaciones de tiempo son bastas. Esto es más útil que el tiempo de la función. –

0

para gprof en * nix, durante el tiempo de compilación y enlace usando el -pg, se inyecta un código adicional en el código del objeto. Luego, al ejecutar gprof, el código inyectado genera un archivo de informe.

2

Como Jon Skeet escribió anteriormente, hay dos estrategias: instrumentación y muestreo.

La instrumentación se realiza tanto de forma manual como automática. En caso manual: el desarrollador inserta código manualmente para rastrear el inicio/final de una región de código de interés. Por ejemplo, un simple "StartTimer" y "EndTimer". Algunas herramientas de creación de perfiles también pueden hacer esto automáticamente; para ello, el generador de perfiles deberá realizar un análisis estático del código, es decir, analizará el código e identificará puntos de control importantes como el inicio/finalización de un método en particular. Esto es más fácil con los idiomas que admiten la reflexión (por ejemplo, cualquier idioma .net). Al usar 'reflexión', el generador de perfiles puede reconstruir todo el árbol de códigos fuente (junto con los gráficos de llamadas).

La toma de muestras la realiza el generador de perfiles y examina el código binario. El generador de perfiles también puede utilizar técnicas como enganchar o atrapar eventos/mensajes de Windows con el fin de crear perfiles.

Tanto la instrumentación como los métodos de muestreo tienen sus propios gastos generales. La cantidad de gastos generales depende, p. si la frecuencia de muestreo se establece en valores altos, entonces el propio perfil puede contribuir significativamente al rendimiento que se informa.

Vs de instrumentación Muestreo: No es que uno sea mejor que el otro enfoque. Ambos tienen su lugar.

El mejor enfoque es comenzar con un generador de perfiles basado en muestras y observar todo el nivel del sistema. Eso es ejecutar la muestra y ver el uso de recursos de todo el sistema: memoria, disco duro, red, CPU.

De lo anterior, identifique los recursos que se están ahogando.

Con la información anterior, ahora puede agregar instrumentación a su código para identificar al culpable. Por ejemplo, si la memoria es el recurso más utilizado, ayudará a instrumentar el código relacionado con la asignación de memoria. Tenga en cuenta que con la instrumentación realmente se está concentrando en un área particular de su código.

Cuestiones relacionadas