Профилирование (компьютерное программирование)

редактировать

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

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

Содержание
  • 1 Сбор событий программы
  • 2 Использование профилировщиков
  • 3 История
  • 4 Типы профилировщиков на основе выходных данных
    • 4.1 Плоский профилировщик
    • 4.2 Профилировщик графа вызовов
    • 4.3 Профилировщик с учетом ввода
  • 5 Детализация данных в типах профилировщика
    • 5.1 Профилировщики на основе событий
    • 5.2 Статистические профилировщики
    • 5.3 Инструменты
    • 5.4 Инструменты интерпретатора
    • 5.5 Гипервизор / Симулятор
  • 6 См. также
  • 7 Ссылки
  • 8 Внешние ссылки
Сбор событий программы

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

Использование профилировщиков
Графический вывод профилировщика CodeAnalyst.

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

— 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
  • Поток записанных событий (a trace )
Для последовательных программ обычно достаточно сводного профиля, но проблемы с производительностью в параллельных программах (ожидание сообщений или проблемы с синхронизацией) часто зависят от временного отношения событий, поэтому для получения полной трассировки требуется понимание происходящего.
Размер (полного) trace линейен по отношению к длине пути программы , что делает его несколько непрактичным. Следовательно, трассировка может быть инициирована в одной точке программы и завершена в другой точке, чтобы ограничить вывод.
Это дает возможность включить или выключить трассировку в любой желаемый момент во время выполнения в дополнение к просмотру текущих показателей для (все еще выполняющейся) программы. Он также дает возможность приостанавливать асинхронные процессы в критических точках для более подробного изучения взаимодействия с другими параллельными процессами.

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

История

Инструменты анализа производительности существовали на платформах 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 году.

Типы профилировщика на основе выходных данных

Плоский профилировщик

Плоские профилировщики вычисляют среднее время вызовов по вызовам и не разбивают время вызовов на основе вызываемого или контекста.

Профилировщик графа вызовов

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

Профилировщик, чувствительный к вводу

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

Детализация данных в типах профилировщиков

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

Профилировщики на основе событий

Перечисленные здесь языки программирования имеют профилировщики на основе событий:

  • Java : API JVMTI (интерфейс инструментов JVM), ранее называвшийся JVMPI (интерфейс профилирования JVM), предоставляет средства профилирования для перехвата таких событий, как вызовы, загрузка класса, выгрузка, вход в поток. leave.
  • .NET : может присоединить агент профилирования в качестве COM-сервера к CLR с помощью Profiling API. Как и Java, среда выполнения затем предоставляет агенту различные обратные вызовы для перехвата таких событий, как метод JIT / enter / leave, создание объекта и т. Д. Особенно мощный, поскольку агент профилирования может переписывать байт-код целевого приложения произвольным образом.
  • Python : профилирование Python включает модуль профиля, hotshot (который основан на графике вызовов), и использование функции sys.setprofile для перехвата таких событий, как c_ {call, return, exception}, python_ {вызов, возврат, исключение}.
  • Ruby : Ruby также использует интерфейс, аналогичный Python для профилирования. Flat-profiler в profile.rb, module и ruby-prof присутствует C.-extension.

Статистические профилировщики

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

Полученные данные не точны, а являются статистическим приближением. «Фактическая величина ошибки обычно составляет более одного периода выборки. Фактически, если значение в 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. Эффект будет зависеть от того, какая информация собирается, от уровня сообщаемых деталей синхронизации и от того, используется ли базовое профилирование блоков в сочетании с инструментами. Например, добавление кода для подсчета каждого вызова процедуры / подпрограммы, вероятно, будет иметь меньший эффект, чем подсчет того, сколько раз выполняется каждый оператор. Некоторые компьютеры имеют специальное оборудование для сбора информации; в этом случае влияние на программу минимально.

Инструментарий является ключом к определению уровня контроля и временного разрешения, доступного профилировщикам.

  • Руководство : Выполняется программистом, например добавив инструкции для явного расчета времени выполнения, просто подсчитайте события или вызовы измерений API-интерфейсов, таких как стандарт измерения отклика приложений.
  • Уровень автоматического источника : инструменты добавлены в исходный код с помощью автоматического инструмента в соответствии с политикой инструментария.
  • Промежуточный язык : инструментарий, добавленный к сборке или декомпилированный байткодами, обеспечивающими поддержку нескольких исходных языков более высокого уровня и предотвращение (несимвольных) проблем с перезаписью двоичного смещения.
  • С помощью компилятора
  • Двоичная трансляция : инструмент добавляет инструментарий к скомпилированному исполняемому файлу.
  • инструментарий времени выполнения : непосредственно перед выполнением код инструментирован. Программа полностью контролируется и контролируется инструментом.
  • Внедрение во время выполнения : Более легкий, чем инструментарий во время выполнения. Код изменяется во время выполнения для перехода к вспомогательным функциям.

Инструментарий интерпретатора

Последняя правка сделана 2021-06-02 07:45:11
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте