Подтвердить что ты не робот

Простейший инструмент для измерения времени и времени кэша программы C и времени процессора в Linux?

Я пишу небольшую программу на C, и я хочу измерить ее производительность.

Я хочу посмотреть, сколько времени он прогоняет в процессоре, и сколько кеш-хитов + пропусков он сделал. Было бы неплохо иметь информацию о переключателях контекста и использовании памяти.

Программа занимает менее секунды для выполнения.

Мне нравится информация /proc/ [pid]/stat, но я не знаю, как ее увидеть после того, как программа умерла/была убита.

Любые идеи?

EDIT: Я думаю, что Valgrind добавляет много накладных расходов. Вот почему мне нужен простой инструмент, такой как /proc/ [pid]/stat, который всегда существует.

4b9b3361

Ответ 1

Используйте перфоманс:

perf stat ./yourapp

Подробную информацию см. в руководстве по созданию wiki для wiki ядра. Это использует аппаратные счетчики производительности вашего процессора, поэтому накладные расходы очень малы.

Пример из 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

Не нужно загружать модуль ядра вручную, в современной системе debian (с пакетом linux-base) он должен работать. С компиляцией "perf record -a" / "perf report" вы также можете выполнить полнопрофильное профилирование. Любое приложение или библиотека, в которой есть отладочные символы, будут отображаться с подробными сведениями в отчете. Для визуализации графики пламени, кажется, работают хорошо.

Ответ 2

Вы также можете использовать

/usr/bin/time -v YourProgram.exe

Он покажет вам всю эту информацию:

/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

Вы также можете использовать флаг -f для форматирования вывода в соответствии с вашими потребностями.

Пожалуйста, не забудьте позвонить в эту программу, используя полный путь, иначе он будет вызывать команду "время", а не то, что вам нужно...

Надеюсь, это поможет!

Ответ 3

Лучший инструмент для вас называется valgrind. Он способен к профилированию памяти, построению call-графа и многим другим.

sudo apt get install valgrind
valgrind ./yourapp

Однако, чтобы получить время выполнения вашей программы, вы можете использовать утилиту time(8) linux.

time ./yourapp