Вопрос

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

Итак, как работает профессиональный профилировщик?Выполняет ли он предварительную обработку кода для вставки контрольных точек или что-то в этом роде?Считывает ли он двоичный код с отладочными данными, чтобы определить, где вызывается функция?

Спасибо.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Измерительные приборы Против отбора проб:Это не значит, что один подход лучше другого.У обоих есть свое место.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top