Какой профилировщик я должен использовать для измерения времени _real_ (включая ожидание Syscalls) потратить на эту функцию, а не _cpu_ One
Вопрос
Приложение не рассчитывает вещи, но вводится вводом/выводом файлов, использует сеть. Я хочу, чтобы Profiler показал это.
Я ожидаю чего -то вроде чего в Callgrind, который вызывает clock_gettime каждый Probly.
Или как Oprofile, что прерывает Мое приложение (пока оно спит или ждет сокета/файла/что угодно), чтобы увидеть, что оно делает.
Я хочу такие вещи, как «читать», «подключиться», «наноссы», «Отправить» и особенно «fsync» (И все их абоненты) быть жирным шрифтом (не такие вещи, как строка или числовые функции, которые выполняют расчеты).
Платформа: GNU/Linux @ i386
Решение
Быстро взломал тривиальную профилировку выборки для Linux: http://vi-server.org/vi/simple_sampling_profiler.html
Он добавляет backtrace(3)
в файл на SIGUSR1
, а затем преобразует его в аннотированный источник.
Поскольку она периодически исследует программу, мы увидим функции, которые что -то ждут.
И когда он идет в стек, мы тоже увидим абонентов.
Также люди из ответов на подобные вопросы рекомендуют Zoom.
Другие советы
Нет реального способа ответить на этот вопрос, не зная вашей платформы и немного больше о том, что вы пытаетесь сделать.
Когда я работаю на платформе Intel, мне нравится использовать Счетчик марки времени (RDTSC). Анкет Трудно победить в списке в диапазоне субмикросекунды. Я просто позвонил в него до и после куски кода и сравниваю разницу.