Простейший инструмент для измерения времени и времени кэша программы C и времени процессора в Linux?
Я пишу небольшую программу на C, и я хочу измерить ее производительность.
Я хочу посмотреть, сколько времени он прогоняет в процессоре, и сколько кеш-хитов + пропусков он сделал. Было бы неплохо иметь информацию о переключателях контекста и использовании памяти.
Программа занимает менее секунды для выполнения.
Мне нравится информация /proc/ [pid]/stat, но я не знаю, как ее увидеть после того, как программа умерла/была убита.
Любые идеи?
EDIT: Я думаю, что Valgrind добавляет много накладных расходов. Вот почему мне нужен простой инструмент, такой как /proc/ [pid]/stat, который всегда существует.
Ответы
Ответ 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