Gracias a la respuesta de @cypheon, revisé BuGLe. Es fantástico, pero tuve que pasar un poco de tiempo para obtener resultados útiles de creación de perfiles. Quería agregar esto como un comentario sobre esa respuesta, pero realmente necesito pegar ejemplos de código completo, así que comencé una nueva respuesta.
Como sugirió, el filtro stats_calltimes es bueno para crear perfiles, no es ideal (ya que no muestra información de la pila), pero con un poco de trabajo, puede mostrar el tiempo total para cada función GL por cuadro
Debe editar los archivos ~/.bugle/filters
y ~/.bugle/statistics
. En primer lugar, añadir esta cadena al final de filters
:
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "average time per call"
}
}
Ahora ejecutar el programa con el comando:
BUGLE_CHAIN=showcalltimes LD_PRELOAD=libbugle.so <your-program>
Esto imprimirá la tiempo medio de permanencia en cada función GL por cuadro. Eso no es terriblemente útil en sí mismo, porque para una llamada como glVertex
, llamada miles de veces por fotograma, probablemente aparecerá como 0.00ms aunque el tiempo acumulado sea bastante significativo. Así que añadir una nueva entrada a statistics
:
"total time per call" = d("calls:*")/d("calls:*") * d("calltimes:*")/d("frames") * 1000
{
precision 3
label "* (ms)"
}
he usado el mismo truco que la estadística de "llamadas por cuadro": multiplicar y dividir por d("calls:*")
para causar un error de división por cero para cualquier función que nunca fue llamado , para evitar mostrar 0.00 para todas las funciones irrelevantes.
Ahora, regresa a la cadena showcalltimes
hemos añadido a filters
, y cambiar "average time per call"
a "total time per call"
:
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "total time per call"
#key_accumulate "A"
#key_noaccumulate "I"
}
}
Y ahora vamos a ver la estadística útil del tiempo total dedicado a cada función, por cuadro. Si desea promediar estas estadísticas en muchos cuadros, elimine el comentario de las líneas anteriores key_accumulate
y luego puede presionar "A" (o reasignarlo a la clave que elija) para comenzar a acumular. Con el tiempo, verá que las estadísticas dejan de rebotar tanto como promedian en muchos cuadros.
También puede registrar estas estadísticas a un archivo de salida con esta cadena:
chain logcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset log
{
filename "bugle.log"
}
filterset logstats
{
show "total time per call"
}
}
Esto es bastante difícil de leer, ya que simplemente pone las estadísticas individuales para cada cuadro, una tras otra, y no he Encontré una manera de promediarlos a lo largo del tiempo. Así que mi método preferido para leer estadísticas es la cadena showcalltimes
con el acumulador encendido.
+1! No es realmente lo que necesito pero parece útil. Y uno puede esperar que incluyan soporte adecuado de perfiles en el futuro. – Staffan
Gracias por la sugerencia. Probé BuGLe y es fantástico (además de gratuito y de código abierto). Sin embargo, me llevó un poco de trabajo obtener una salida de generación de perfiles útil, así que agregué una [nueva respuesta] (http://stackoverflow.com/a/8859325/368821) describiendo en detalle cómo logro una buena salida de creación de perfiles. – mgiuca