Введение
Измерение времени или ресурсов, используемых отдельным разделом компьютерной программы
В разработке программного обеспечения профилирование ("профилирование программ", "профилирование ПО") — это вид динамического анализа программы, который измеряет, например, пространственную (по памяти) или временную сложность программы, использование конкретных инструкций, а также частоту и длительность вызовов функций. Чаще всего информация, полученная в результате профилирования, используется для оптимизации программы, и в частности, для повышения производительности. Профилирование достигается путем добавления в программу кода для сбора данных (инструментирования) либо исходного кода программы, либо ее исполняемого двоичного файла с помощью инструмента, называемого профилировщиком (или профилирующим кодом). Профилировщики могут использовать различные методы, такие как методы, основанные на событиях, статистические, методы инструментального анализа и моделирования.
События программы собрания
Профилировщики используют широкий спектр техник для сбора данных, включая аппаратные прерывания, инструментарий кода, эмуляцию набора инструкций, перехватчики операционной системы и счётчики производительности.
История
Инструменты анализа производительности существовали на платформах 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 и некоторые современные процессоры MIPS с интерфейсом JTAG имеют регистр PCSAMPLE, который опрашивает счетчик программ действительно незаметным образом, позволяя неинтрузивно собирать плоский профиль. Среди наиболее часто используемых статистических профилировщиков для Java/управляемого кода можно выделить AQtime от SmartBear Software и CLR Profiler от Microsoft. Эти профилировщики также поддерживают профилирование нативного кода, наряду с Shark (OSX), OProfile (Linux), Intel VTune и Parallel Amplifier (входящим в состав Intel Parallel Studio) и Oracle Performance Analyzer, среди прочих.
Инструментация интерпретатора
Опции отладки интерпретатора могут включать сбор метрик производительности по мере выполнения интерпретатором каждого оператора целевого кода. Интерпретаторы байт-кода, таблиц управления или JIT-компиляторы — это три примера, которые обычно обладают полным контролем над выполнением целевого кода, что позволяет собирать чрезвычайно подробные данные.
Гипервизор/симулятор
Гипервизор: Данные собираются путем запуска (обычно) немодифицированной программы под гипервизором. Пример: SIMMON.
Симулятор и гипервизор: Данные собираются интерактивно и выборочно путем запуска немодифицированной программы в симуляторе набора команд.
Simulator and Hypervisor: Data collected interactively and selectively by running the unmodified program under an instruction set simulator.