Профилирование частичных программ в Linux

У меня есть программа, в которой значительное количество времени тратится на загрузку и сохранение данных. Теперь я хочу знать, сколько времени занимает каждая функция в процентах от общего времени выполнения. Однако я хочу исключить время, затрачиваемое на загрузку и сохранение функций, из общего времени, учитываемого профилировщиком. Есть ли способ сделать это с помощью gprof или любого другого популярного профайлера?


person MetallicPriest    schedule 07.07.2011    source источник
comment
Это то, в чем gprof на самом деле хорош (при условии, что у вас нет рекурсии), потому что он не производит выборку во время ввода-вывода.   -  person Mike Dunlavey    schedule 08.07.2011


Ответы (4)


Точно так же вы можете использовать

valgrind --tool=callgrind --collect-atstart=no --toggle-collect=<function> 

Другие варианты для просмотра:

--instr-atstart    # to avoid runtime overhead while not profiling

Чтобы получить статистику уровня обучения:

--collect-jumps=yes
--dump-instr=yes

В качестве альтернативы вы можете «удаленно управлять» им на лету: callgrind_control или аннотировать свой исходный код (IIRC также со статистикой предсказания переходов): callgrind_annotate.

Превосходный инструмент kcachegrind — это замечательный инструмент визуализации/навигации. Я едва могу рекомендовать это достаточно:

введите здесь описание изображения

person sehe    schedule 07.07.2011
comment
+1 Дал бы больше, если бы мог. valgrind и kcachegrind замечательная пара! - person Michael Mior; 08.07.2011
comment
Я ценю ваш ответ, но я спешу в данный момент. Не хочу изучать новых профилировщиков в данный момент. - person MetallicPriest; 08.07.2011

Я бы подумал об использовании чего-то более современного, чем gprof, например OProfile. При создании отчета с помощью opreport вы можете использовать опцию --exclude-symbols, чтобы исключить функции, которые вас не интересуют.

Дополнительные сведения см. на веб-странице OProfile; однако краткое руководство см. на странице документации OProfile.

person DaveR    schedule 07.07.2011
comment
Но OProfile — это общесистемный профайлер. Я не думаю, что это дает очень точные результаты для профилирования отдельных процессов. - person MetallicPriest; 08.07.2011
comment
Да, OProfile может выполнять общесистемное профилирование; но вы можете отфильтровать его, чтобы предоставить данные для одного двоичного файла приложения или процесса (он может пометить все данные, которые он собирает, процессом, из которого они получены). - person DaveR; 08.07.2011
comment
Это довольно точно по моему опыту. - person static_rtti; 08.07.2011
comment
В данный момент я тороплюсь, поэтому было бы хорошо, если бы существовало какое-то простое решение в gprof. - person MetallicPriest; 08.07.2011

Zoom от RotateRight предлагает общесистемный профиль времени для Linux. Если ваш код проводит много времени в операциях ввода-вывода, то это время не будет отображаться в профиле времени ЦП. В качестве альтернативы, если вы хотите учитывать время, затрачиваемое на ввод-вывод, попробуйте «профиль времени потока».

person biscuits    schedule 20.07.2011

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

например Формат [functionKey,timeStamp\n]

... затем загрузите это в Excel. Получите дельты, а затем включите или исключите их на основе функций if. Ничего фантастического. С другой стороны, вы можете получить некоторые визуализации довольно дешево.

person sgtz    schedule 07.07.2011