2008-09-16 19 views
7

No es raro que tenga un programa cuyo rendimiento depende en gran medida de unas pocas funciones y deseo poder medir la velocidad de un solo ciclo o segmento de código en precisión de un solo reloj para saber si mis cambios realmente están mejorando rendimiento o si simplemente estoy cayendo en el placebo del código "optimizado".¿Cuál es su herramienta favorita de perfil de bajo nivel?

Personalmente me encuentro usando ffmpeg's "bench.h", un conjunto de macros C que usa rdtsc para medir la hora del reloj y compensa automáticamente los cambios de contexto y similares. Por supuesto, este enfoque tiene sus propias debilidades; ¿Qué otros métodos de perfil de bajo perfil les gusta a los usuarios de StackOverflow?

Respuesta

2

No hago programación de bajo nivel ahora, pero si lo hiciera, definitivamente me fijaría en dtrace; por lo que he leído, se ve extremadamente interesante. Para usuarios de OS X también hay shark.

0

El problema principal es que cuando "compila" en su evaluación comparativa puede modificar los resultados (dependiendo del cómo y cuándo de la implementación). Y con esas cosas de bajo nivel, probablemente estés muy influenciado por las optimizaciones de tu compilador.

Pero personalmente en Linux tengo un punto débil para oprofile (oprofile) este es un perfil de todo el sistema que está incrustado como un módulo kernel y rastrea periódicamente dónde está gastando su tiempo la aplicación. Así que esto perfila todo su sistema, no solo una aplicación. Pero podría ser que no le da suficiente granularidad.

0

Aconsejaría no instrumentar su código para perfilarlo. La mejor respuesta que puedo dar es usar PTU (Performance Tuning Utility) de Intel, se puede encontrar aquí:

Esta utilidad es el descendiente directo de VTune y proporciona el mejor generador de perfiles de muestreo disponible. Podrá rastrear dónde está pasando la CPU o perder tiempo (con la ayuda de los eventos de hardware disponibles), y esto sin desaceleración de su aplicación o perturbación del perfil.

1

valgrind ya se ha mencionado, pero es especialmente útil con la herramienta Callgrind:

$ valgrind --tool=callgrind your_program 

continuación, puede utilizar KCacheGrind para visualizar los datos.

0

Para Linux: Google Perftools

  • Más rápido que valgrind (sin embargo, no tan grano fino)
  • no necesita código de instrumentación
  • Niza salida gráfica (-> kcachegrind)
  • ¿El perfil de la memoria, perfil de la CPU, comprobación de fugas
0

OK, estás describiendo un calor - situación de punto - un lazo cerrado que ocupa una gran fracción de tiempo y no contiene llamadas de función.

Desea saber si los cambios que realiza están teniendo algún efecto.

Esto es lo que yo haría:

  • Para ver qué hay que cambiar para hacerlo más rápido, dos métodos, con hueso simple:

1) un solo paso a través del bucle interno , para ver exactamente lo que está haciendo y por qué. Las posibilidades son bastante buenas. Veré algunas cosas que podrían hacerse mejor.

y/o

2) ponerlo en marcha en un bucle exterior grande, y después interrumpir manualmente. Haz esto varias veces. Las instrucciones/declaraciones que representan la mayor parte del tiempo aparecerán en esas muestras aproximadamente en proporción a su costo.

  • saber si he hecho alguna diferencia, otra técnica hueso-simple:

ejecutarlo mil millones de veces en un bucle exterior y contar los segundos. Eso dice cuántos nanosegundos toma el ciclo interno.

Cuestiones relacionadas