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

Как работают профилировщики кода?

В то время как я работал над университетским проектом, я использовал проектный внутренний профилировщик, сделанный старшим учеником, он был очень простым, но достаточно хорошим, так как его задача заключалась в том, чтобы вычесть время между двумя точками кода и дать статистику.

Теперь, как работает профессиональный профайлер? Предоставляет ли он предварительный код для вставки контрольных точек или подобных вещей? Он считывает двоичный код с данными отладки, чтобы поймать, где вызывается функция?

Спасибо.

4b9b3361

Ответ 1

Существует множество различных профилографов, которые работают по-разному.

Обычно используемые профилировщики регулярно проверяют запущенную программу, чтобы увидеть, какая команда сборки выполняется (счетчик программ) и какие подпрограммы вызывают текущую функцию (стек вызовов). Этот профилировщик выборки может работать со стандартными двоичными файлами, но более полезен, если у вас есть отладочные символы, чтобы выработать строки кода с указанными адресами в программе.

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

Другие профилирующие устройства включают в себя повторную компиляцию программы для вставки инструкций (известных как Instrument), чтобы подсчитать, как часто выполняется каждый непрерывный набор инструкций (базовых блоков) или, возможно, даже записывать последовательность, в которой базовые блоки выполняются или записывают содержимое переменных в определенных местах.

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

Ответ 2

Существуют две общие стратегии профилирования (для языков на основе виртуальной машины): инструменты и выборка.

Инструментарий вставляет контрольные точки и информирует профайлер каждый раз, когда метод запускается и заканчивается. Это может быть сделано JIT/интерпретатором или пост-нормальным, но предварительным этапом, который просто изменяет исполняемый файл. Это может существенно повлиять на производительность (таким образом, искажая любые результаты синхронизации). Это полезно для получения точных значений.

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

Ответ 3

Это зависит от типа анализируемого кода, например .NET CLR предоставляет средство для профайлов кода. При работе с управляемым кодом можно переписать промежуточный код для ввода пользовательских перехватчиков. Также вы можете анализировать трассировку стека приложений. Операционная система может предоставлять средства для профилирования, например Windows имеет счетчики производительности. При работе со встроенным кодом вы можете эмулировать/заменять базовое оборудование, чтобы эффективно контролировать производительность системы.

Ответ 4

Как написал Джон Скит, есть две стратегии: инструментальная и выборка.

Инструментарий выполняется как вручную, так и автоматически. В ручном случае: разработчик вручную вставляет код для отслеживания начала/конца области кода интереса. Например, простой "StartTimer" и "EndTimer". Некоторые инструменты профилировщика могут сделать это автоматически также - для этого профилировщику необходимо будет выполнить статический анализ кода, то есть он анализирует код и идентифицирует важные контрольные точки, такие как начало/конец конкретного метода (ов). Это проще всего на языках, поддерживающих отражение (например, на любом языке .net). Используя "отражение", профилировщик может перестроить все дерево исходного кода (вместе с графиками вызовов).

Сэмплирование выполняется профилировщиком, и он обращается к двоичному коду. Профилировщик также может использовать такие методы, как "Крюки" или "Ловушка" событий/сообщений Windows с целью профилирования.

Оба инструментария и методы выборки имеют свои собственные накладные расходы. Количество накладных расходов зависит, например. если частота дискретизации установлена ​​на высокие значения, то сам профилирование может значительно способствовать сообщению о производительности.

Измерительная аппаратура: Это не похоже на то, что один лучше другого. Оба имеют свое место.

Лучший подход - начать с профилировщика на основе выборки и посмотреть на весь уровень системы. Это запускает пробоотборник и видит использование ресурсов системы: память, жесткий диск, сеть, процессор.

Из вышеизложенного укажите ресурсы, которые задыхаются.

С приведенной выше информацией вы можете добавить инструменты в свой код, чтобы указать на виновника. Например, если память является наиболее часто используемым ресурсом, то это поможет измерить ваш код распределения памяти. Обратите внимание, что с помощью инструментария вы действительно концентрируетесь на определенной области вашего кода.

Ответ 5

для gprof в * nix, при компиляции и времени ссылки с помощью -pg, дополнительный код вводится в код объекта. Затем, запустив gprof, файл сгенерирован с помощью введенного кода.