la herramienta más simple para medir el hit / miss de C program cache y el tiempo de cpu en linux?


Estoy escribiendo un pequeño programa en C, y quiero medir su rendimiento.

Quiero ver cuánto tiempo se ejecuta en el procesador y cuántos aciertos y errores de caché se han realizado. También sería bueno tener información sobre los cambios de contexto y el uso de memoria.

El programa tarda menos de un segundo en ejecutarse.

Me gusta la información de /proc/[pid]/stat, pero no se como verla después de que el programa ha muerto/ha sido asesinado.

Cualquiera ideas?

EDIT: Creo que Valgrind agrega una gran cantidad de gastos generales. Es por eso que quería una herramienta simple, como /proc/[pid]/stat, que siempre está ahí.

Author: jschoi, 2012-04-10

3 answers

Use perf :

perf stat ./yourapp

Vea el tutorial del kernel wiki perf para más detalles. Esto utiliza los contadores de rendimiento de hardware de su CPU, por lo que la sobrecarga es muy pequeña.

Ejemplo del wiki:

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

        5,099 cache-misses             #      0.005 M/sec (scaled from 66.58%)
      235,384 cache-references         #      0.246 M/sec (scaled from 66.56%)
    9,281,660 branch-misses            #      3.858 %     (scaled from 33.50%)
  240,609,766 branches                 #    251.559 M/sec (scaled from 33.66%)
1,403,561,257 instructions             #      0.679 IPC   (scaled from 50.23%)
2,066,201,729 cycles                   #   2160.227 M/sec (scaled from 66.67%)
          217 page-faults              #      0.000 M/sec
            3 CPU-migrations           #      0.000 M/sec
           83 context-switches         #      0.000 M/sec
   956.474238 task-clock-msecs         #      0.999 CPUs

   0.957617512  seconds time elapsed

No es necesario cargar un módulo del núcleo manualmente, en un sistema debian moderno (con el paquete linux-base) debería funcionar. Con el combo 'perf record-a' / 'perf report' también puede hacer perfiles de sistema completo. Cualquier aplicación o biblioteca que tenga depuración los símbolos aparecerán con los detalles en el informe. Para la visualización los gráficos de llama parecen funcionar bien.

 76
Author: maxy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-17 14:38:06

También puedes usar

/usr/bin/time -v YourProgram.exe

Te mostrará toda esta información:

/usr/bin/time -v ls
    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 60%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 4080
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 314
    Voluntary context switches: 1
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

También puede usar la bandera-f para formatear la salida para que se ajuste a sus necesidades.

Por favor, asegúrese de llamar a este programa usando su ruta completa, de otra manera llamará al comando 'time' y eso no es lo que necesita...

Espero que esto ayude!

 12
Author: Javi Ortiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-22 13:36:34

La mejor herramienta para usted se llama valgrind. Es capaz de perfilar la memoria, construir gráficos de llamadas y mucho más.

sudo apt get install valgrind
valgrind ./yourapp

Sin embargo, para obtener el tiempo de ejecución de su programa, puede usar la utilidad time(8) linux.

time ./yourapp
 8
Author: iehrlich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-11 19:45:58