Pregunta

Mientras trabajaba en un proyecto universitario, utilicé un generador de perfiles interno del proyecto hecho por un estudiante mayor, era muy básico pero lo suficientemente bueno ya que su tarea era restar tiempos entre dos puntos del código y proporcionar estadísticas.

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

Gracias.

¿Fue útil?

Solución

Hay muchos perfiladores 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 la función actual (la pila de llamadas). Este tipo de perfilador de muestreo puede funcionar con archivos binarios estándar, pero son más útiles si tiene símbolos de depuración para resolver líneas de código dadas en el programa.

Además de muestrear regularmente, también puede usar contadores de rendimiento del procesador para muestrear después de un cierto número de eventos, como errores de caché, que lo 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 (conocidas como instrumentación ) para contar con qué frecuencia se ejecuta cada conjunto continuo de instrucciones (bloques básicos), o tal vez incluso registrar la secuencia en la que los bloques básicos se ejecutan o registran el contenido de variables en ciertos lugares.

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

Otros consejos

Hay dos estrategias comunes de creación de perfiles (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 un método comienza y termina. Esto lo puede hacer 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 (sesgando los resultados de sincronización). Sin embargo, es bueno para obtener recuentos precisos.

Muestreo pregunta periódicamente a la máquina virtual cómo se ve el seguimiento de la pila para todos los subprocesos y actualiza sus estadísticas de esa manera. Esto generalmente afecta menos el rendimiento, pero produce recuentos de llamadas menos precisos.

Depende del tipo de código que se analiza, por ejemplo .NET CLR proporciona instalación para perfiladores de código. Cuando se trata de código administrado, es posible reescribir código intermedio para inyectar enlaces personalizados. También puede analizar el seguimiento de la pila de las aplicaciones. El sistema operativo puede proporcionar medios para la creación de perfiles, por ejemplo, Windows tiene rendimiento contadores . Cuando se trata de código incrustado, puede emular / sustituir el hardware subyacente para monitorear efectivamente el rendimiento del sistema.

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 manualmente el código 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 esto, el generador de perfiles necesitará hacer un análisis estático del código, es decir, analiza el código e identifica puntos de verificación importantes como el inicio / final de un método (s) en particular. Esto es más fácil con lenguajes que admiten la reflexión (por ejemplo, cualquier idioma .net). Usando 'reflexión', el generador de perfiles puede reconstruir todo el árbol de código fuente (junto con los gráficos de llamadas).

El perfilador realiza el muestreo y analiza el código binario. El generador de perfiles también puede utilizar técnicas como Ganchos o capturar eventos / mensajes de Windows con el fin de crear un perfil.

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 perfil en sí mismo puede contribuir significativamente al rendimiento que se informa.

Instrumentación Vs 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 muestreo y observar todo el nivel del sistema. Es ejecutar el muestreador 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 señalar 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.

para gprof en * nix, en el momento de la compilación y el enlace utilizando el -pg, se inyecta un código extra en el código objeto. Luego, al ejecutar gprof, el código inyectado genera un archivo de informe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top