В программная инженерия, профилирование («профилирование программы», « профилирование программного обеспечения ") - это форма динамического анализа программы, которая измеряет, например, пространственную (память) или временную сложность программы, использование определенных инструкций, или частота и продолжительность вызовов функций. Чаще всего информация о профилировании служит для помощи оптимизации программы.
Профилирование достигается посредством инструментария либо исходного кода программы, либо его двоичной исполняемой формы с помощью инструмента, называемого профилировщиком ( или профилировщик кода). Профилировщики могут использовать ряд различных методов, таких как методы на основе событий, статистические, инструментальные и имитационные методы.
Профилировщики используют широкий спектр методов для сбора данных, включая аппаратные прерывания, инструментарий кода, имитация набора команд, операционная система перехватчики и счетчики производительности. Профилировщики используются в процессе проектирования производительности.
Инструменты анализа программы чрезвычайно важны для понимания поведения программы. Компьютерные архитекторы нуждаются в таких инструментах, чтобы оценить, насколько хорошо программы будут работать на новых архитектурах. Разработчикам программного обеспечения нужны инструменты для анализа своих программ и выявления критических участков кода. Составители компиляторов часто используют такие инструменты, чтобы узнать, насколько хорошо выполняется их алгоритм планирования инструкций или предсказания переходов...
— ATOM, PLDI, '94Результатом профилировщика может быть:
/ * ------------ источник ------------- ------------ count * / 0001 IF X = "A" 0055 0002 THEN DO 0003 ADD 1 to XCOUNT 0032 0004 ELSE 0005 IF X = "B" 0055
Профилировщик может применяться к отдельному методу или в масштабе модуля или программы, чтобы идентифицировать узкие места производительности с помощью сделать очевидным длительный код. Профилировщик можно использовать для понимания кода с точки зрения синхронизации с целью его оптимизации для обработки различных условий выполнения или различных нагрузок. Результаты профилирования могут быть получены компилятором, который обеспечивает оптимизацию на основе профиля. Результаты профилирования могут использоваться для разработки и оптимизации отдельного алгоритма; алгоритм сопоставления подстановочных знаков Краусса является примером. Профилировщики встроены в некоторые системы управления производительностью приложений, которые собирают данные профилирования, чтобы получить представление о рабочих нагрузках транзакций в распределенных приложениях.
Инструменты анализа производительности существовали на платформах IBM / 360 и IBM / 370 с начала 1970-х годов, обычно они основывались на прерываниях таймера, которые записывали слово состояния программы (PSW) с установленными интервалами таймера для обнаружения «горячих точек» в исполняемом коде. Это был ранний пример выборки (см. Ниже). В начале 1974 года имитаторы набора команд допускали полную трассировку и другие функции мониторинга производительности.
Анализ программ на основе профилировщика в Unix восходит к 1973 году, когда системы Unix включали в себя базовый инструмент, prof
, в котором перечислены все функции и время выполнения программы. В 1982 году gprof
расширил концепцию до полного анализа графа звонков.
В 1994 году Амитабх Шривастава и Алан Юстас из Digital Equipment Corporation опубликовала документ, описывающий ATOM (инструменты анализа с OM). Платформа ATOM преобразует программу в собственный профилировщик: во время компиляции он вставляет код в программу, которую нужно проанализировать. Этот вставленный код выводит данные анализа. Этот метод - изменение программы для анализа самой себя - известен как «инструментарий ».
В 2004 году газеты gprof
и ATOM вошли в список 50 самых влиятельных статей PLDI за 20-летний период, закончившийся в 1999 году.
Плоские профилировщики вычисляют среднее время вызовов по вызовам и не разбивают время вызовов на основе вызываемого или контекста.
График вызовов Профилировщики показывают время вызовов и частоту функций, а также задействованные цепочки вызовов в зависимости от вызываемого. В некоторых инструментах полный контекст не сохраняется.
Профилировщики, чувствительные к вводу, добавляют дополнительное измерение к профилировщикам с плоским графиком или графиком вызовов, связывая показатели производительности с характеристиками рабочих нагрузок ввода, такими как размер ввода или вводимые значения. Они генерируют диаграммы, которые характеризуют масштабирование производительности приложения в зависимости от вводимых данных.
Профилировщики, которые также являются самими программами, анализируют целевые программы, собирая информацию об их выполнении. В зависимости от детализации данных и того, как профилировщики собирают информацию, они подразделяются на профилировщики на основе событий или статистические профилировщики. Профилировщики прерывают выполнение программы для сбора информации, что может привести к ограниченному разрешению в измерениях времени, к чему следует относиться с недоверием. Базовый блок профилировщики сообщают о количестве машинных тактовых циклов, выделенных на выполнение каждой строки кода, или о времени, основанном на их сложении; время, сообщаемое для каждого базового блока, может не отражать разницу между кешем попаданиями и промахами.
Перечисленные здесь языки программирования имеют профилировщики на основе событий:
Некоторые профилировщики работают по выборке. Профилировщик выборки проверяет стек вызовов целевой программы через регулярные промежутки времени, используя прерывания операционной системы . Профили выборки обычно менее точны в числовом отношении и конкретны, но позволяют целевой программе работать почти на полной скорости.
Полученные данные не точны, а являются статистическим приближением. «Фактическая величина ошибки обычно составляет более одного периода выборки. Фактически, если значение в n раз превышает период выборки, ожидаемая ошибка в нем равна квадратному корню из n периодов выборки».
На практике выборочные профилировщики часто могут предоставить более точную картину выполнения целевой программы, чем другие подходы, поскольку они не так навязчивы для целевой программы и, следовательно, не имеют так много побочных эффектов (например, как в кэшах памяти или конвейерах декодирования команд). Кроме того, поскольку они не так сильно влияют на скорость выполнения, они могут обнаруживать проблемы, которые в противном случае были бы скрыты. Они также относительно невосприимчивы к переоценке стоимости небольших, часто называемых рутинных операций или «жестких» циклов. Они могут показать относительное количество времени, проведенного в пользовательском режиме по сравнению с режимом ядра с прерываниями, таким как обработка системного вызова.
Тем не менее, код ядра для обработки прерываний влечет за собой незначительную потерю циклов ЦП, переадресацию использования кеша и неспособен различать различные задачи, возникающие в непрерывном коде ядра (активность микросекундного диапазона).
Специальное оборудование может выйти за рамки этого: ARM Cortex-M3 и интерфейс JTAG некоторых недавних процессоров MIPS имеют регистр PCSAMPLE, который производит выборку программного счетчика в поистине необнаруживаемой манере, позволяя ненавязчиво сборник плоского профиля.
Некоторые часто используемые статистические профилировщики для Java / управляемого кода: SmartBear Software AQtime и Microsoft CLR Profiler. Эти профилировщики также поддерживают профилирование собственного кода вместе с Shark (OSX) от Apple Inc. (OSX), OProfile (Linux), Intel VTune и Parallel Amplifier (часть Intel Parallel Studio ), а также Oracle Performance Analyzer и другие.
Этот метод эффективно добавляет инструкции к целевой программе для сбора необходимой информации. Обратите внимание, что инструментирование программы может вызвать изменения производительности, а в некоторых случаях может привести к неточным результатам и / или heisenbugs. Эффект будет зависеть от того, какая информация собирается, от уровня сообщаемых деталей синхронизации и от того, используется ли базовое профилирование блоков в сочетании с инструментами. Например, добавление кода для подсчета каждого вызова процедуры / подпрограммы, вероятно, будет иметь меньший эффект, чем подсчет того, сколько раз выполняется каждый оператор. Некоторые компьютеры имеют специальное оборудование для сбора информации; в этом случае влияние на программу минимально.
Инструментарий является ключом к определению уровня контроля и временного разрешения, доступного профилировщикам.