Процент выполнения кода профиля C (построчная аннотация)

Мне нужно профилировать пару кодов C и получить аннотированный файл с процентом времени выполнения, взятого каждой строкой или по крайней мере для каждого блока (while/if-else/for-functions) и т. Д.

До сих пор я изучал valgrind (callgrind), gperf и некоторые другие инструменты. Пока что я получаю

  • Подсчет каждой функции или строки исходного кода, например, сколько раз она выполняется.
  • Или процент графа.
  • Или время выполнения каждого вызова функции.

Что мне действительно нужно, однако, если процент времени выполнения не считается, и это должно быть для каждой строки исходного кода или по крайней мере для всех блоков (while/if-else/for-functions).

Может кто-нибудь сообщить мне, как я могу это сделать?

Спасибо,

2 ответа

Я верю perf(1) (часть linux-tools-common пакет в Ubuntu) получит то, что вы хотите. Он использует основанную на ядре подсистему, называемую Счетчики производительности для Linux, включенную в более новые ядра. Более подробную информацию можно найти здесь.

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

$ perf record ./myprogram arg1 arg2
$ perf report

Кахегринд тоже может стоить изучить.

Вам нужно что-то, что сэмплирует стек, как по времени процессора, так и по часам, если вы хотите включить ввод / вывод. Вам не нужна особенно высокая частота дискретизации.

Каждый образец стека представляет собой список местоположений кода, некоторые из которых можно отследить до строк в коде.

Включающая процентная стоимость строки кода - это просто количество выборок стека, которые его содержат, деленное на общее количество выборок стека (умноженное на 100).

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

Исключительный процент - это доля выборок, где эта строка появляется в конце.

Если строка кода появляется более одного раза в образце стека, это все еще только один образец, содержащий ее. (Это заботится о рекурсии.)

Какие инструменты могут сделать это? Может быть oprofile, Конечно Zoom,

Другие вопросы по тегам