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

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

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

Мероприятия программы сбора

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

Использование профилировщиков

Графический вывод CodeAnalyst профайлер.

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

— АТОМ, PLDI, '94

Результатом профилировщика может быть:

  • Статистический резюме наблюдаемых событий (a профиль)
Сводная информация профиля часто отображается в аннотации к заявлениям исходного кода, в которых происходят события, поэтому размер данных измерений линейно зависит от размера кода программы.
/ * ------------ источник ------------------------- count * / 0001 IF X = "A" 00550002 THEN DO 0003 ADD 1 to XCOUNT 00320004 ELSE0005 IF X = "B" 0055
  • Поток записанных событий ( след)
Для последовательных программ обычно достаточно сводного профиля, но проблемы с производительностью в параллельных программах (ожидание сообщений или проблемы с синхронизацией) часто зависят от временного соотношения событий, поэтому требуется полная трассировка, чтобы понять, что происходит.
Размер (полной) трассы линейно зависит от размера программы. длина пути инструкции, что делает его несколько непрактичным. Следовательно, трассировка может быть инициирована в одной точке программы и завершена в другой точке для ограничения вывода.
  • Постоянное взаимодействие с гипервизор (например, непрерывный или периодический мониторинг с помощью экранного дисплея)
Это дает возможность включить или выключить трассировку в любой желаемый момент во время выполнения в дополнение к просмотру текущих показателей (все еще выполняющейся) программы. Это также дает возможность приостанавливать асинхронные процессы в критических точках для более подробного изучения взаимодействия с другими параллельными процессами.

Профилировщик можно применить к отдельному методу или в масштабе модуля или программы, чтобы выявить узкие места в производительности, сделав очевидным длительный код.[1] Профилировщик может использоваться для понимания кода с точки зрения времени, с целью его оптимизации для обработки различных условий выполнения.[2] или различные нагрузки.[3] Результаты профилирования могут быть получены компилятором, который предоставляет профильная оптимизация.[4] Результаты профилирования можно использовать для разработки и оптимизации отдельного алгоритма; то Алгоритм сопоставления подстановочных знаков Краусса это пример.[5] Профайлеры встроены в некоторые управление производительностью приложений системы, которые собирают данные профилирования, чтобы обеспечить понимание сделка рабочие нагрузки в распределен Приложения.[6]

История

Инструменты анализа производительности существовали на IBM / 360 и IBM / 370 платформы с начала 1970-х, обычно основанные на прерываниях таймера, которые записывали слово состояния программы (PSW) через заданные интервалы таймера для обнаружения «горячих точек» в исполняемом коде.[нужна цитата ] Это был ранний пример отбор проб (Смотри ниже). В начале 1974 г. тренажеры с инструкциями разрешена полная трассировка и другие функции мониторинга производительности.[нужна цитата ]

Анализ программ на основе профилировщика в Unix восходит к 1973 году,[7] когда системы Unix включали базовый инструмент, проф, в котором перечислены все функции и время выполнения программы. В 1982 г. гпроф расширил концепцию до полной график звонков анализ.[8]

В 1994 году Амитабх Шривастава и Алан Юстас из Корпорация цифрового оборудования опубликовал статью с описанием АТОМ[9](Инструменты анализа с OM). Платформа ATOM преобразует программу в собственный профилировщик: at время компиляции, он вставляет код в анализируемую программу. Этот вставленный код выводит данные анализа. Этот метод - изменение программы для анализа самой себя - известен как "приборы ".

В 2004 г. гпроф и АТОМ вошли в список 50 самых влиятельных PLDI документы за 20-летний период, закончившийся в 1999 г.[10]

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

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

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

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

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

Профилировщик с учетом ввода

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

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

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

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

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

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

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

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

Полученные данные не точные, а статистическое приближение. «Фактическая величина ошибки обычно составляет более одного периода выборки. Фактически, если значение в n раз превышает период выборки, ожидаемая ошибка в нем равна квадратному корню из n периодов выборки». [16]

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

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

Специальное оборудование может выходить за рамки этого: ARM Cortex-M3 и интерфейс JTAG некоторых недавних процессоров MIPS имеют регистр PCSAMPLE, который производит выборку счетчик команд по-настоящему незаметным образом, позволяя ненавязчиво собирать плоский профиль.

Некоторые часто используемые[17] статистические профилировщики для Java / управляемого кода Программное обеспечение SmartBear с AQtime[18] и Microsoft с Профилировщик CLR.[19] Эти профилировщики также поддерживают профилирование собственного кода вместе с Apple Inc. с Акула (OSX),[20] OProfile (Linux),[21] Intel VTune и параллельный усилитель (часть Intel Parallel Studio ), и Oracle Анализатор производительности,[22] среди прочего.

Приборы

Этот метод эффективно добавляет инструкции к целевой программе для сбора необходимой информации. Обратите внимание, что инструменты программа может вызвать изменения производительности, а в некоторых случаях может привести к неточным результатам и / или Heisenbugs. Эффект будет зависеть от того, какая информация собирается, от уровня сообщаемых деталей синхронизации и от того, используется ли базовое профилирование блоков вместе с инструментарием.[23] Например, добавление кода для подсчета каждого вызова процедуры / подпрограммы, вероятно, будет иметь меньший эффект, чем подсчет того, сколько раз выполняется каждый оператор. Некоторые компьютеры имеют специальное оборудование для сбора информации; в этом случае влияние на программу минимально.

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

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

Инструменты переводчика

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

Гипервизор / Симулятор

  • Гипервизор: Данные собираются путем запуска (обычно) неизмененной программы под гипервизор. Пример: Симмон
  • Симулятор и Гипервизор: Данные, собираемые интерактивно и выборочно, путем запуска неизмененной программы под Симулятор набора инструкций.

Смотрите также

Рекомендации

  1. ^ «Как найти узкое место в производительности в настольном приложении C #?». Переполнение стека. 2012.
  2. ^ Краусс, Кирк Дж (2017). «Профилирование производительности с фокусом». Развивайте производительность.
  3. ^ «Что такое профилирование кода? Изучите 3 типа профилировщиков кода». Советы, уловки и ресурсы для разработчиков Stackify. Disqus. 2016 г.
  4. ^ Лоуренс, Эрик (2016). «Начало работы с оптимизацией по профилю». тесты. WordPress.
  5. ^ Краусс, Кирк (2018). «Подстановочные знаки соответствия: улучшенный алгоритм для больших данных». Развивайте производительность.
  6. ^ «Список профилировщиков .Net: 3 различных типа и зачем они вам нужны». Советы, уловки и ресурсы для разработчиков Stackify. Disqus. 2016 г.
  7. ^ Руководство программиста Unix, 4-е издание
  8. ^ а б S.L. Грэм, П. Кесслер, М.К. МакКусик, gprof: профилировщик выполнения графика вызовов, Материалы симпозиума SIGPLAN '82 по созданию компиляторов, СИГПЛАН Уведомления, Vol. 17, № 6, стр. 120–126; DOI: 10.1145 / 800230.806987
  9. ^ А. Шривастава и А. Юстас, ATOM: система для создания специализированных инструментов анализа программ., Труды конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI '94), стр. 196-205, 1994; ACM Уведомления SIGPLAN - Лучшее из PLDI 1979–1999 гг. Архив домашней страницы, Vol. 39, No. 4, pp. 528-539; DOI: 10.1145 / 989393.989446
  10. ^ 20 лет PLDI (1979–1999): подборка, Кэтрин С. МакКинли, Редактор
  11. ^ Э. Коппа, К. Деметреску и И. Финокки, Профилирование с учетом ввода, IEEE Trans. Software Eng. 40 (12): 1185–1205 (2014); DOI: 10.1109 / TSE.2014.2339825
  12. ^ Д. Запаранукс и М. Хаусвирт, Алгоритмическое профилирование, Материалы 33-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI 2012), Уведомления ACM SIGPLAN, Vol. 47, No. 6, pp. 67-76, 2012; DOI: 10.1145 / 2254064.2254074
  13. ^ Т. Кустнер, Дж. Вайдендорфер, Т. Вайнцирль, Профилирование, контролируемое аргументом, Труды Euro-Par 2009 - Семинары по параллельной обработке, Лекционные заметки по информатике, Vol. 6043, стр. 177–184, 2010; DOI: 10.1007 / 978-3-642-14122-5 22
  14. ^ «Сроки и профилирование - основные профилировщики блоков». Архив OpenStax CNX.
  15. ^ Болл, Томас; Ларус, Джеймс Р. (1994). «Оптимальное профилирование и отслеживание программ» (PDF). Транзакции ACM по языкам и системам программирования. Цифровая библиотека ACM. 16 (4): 1319–1360. Дои:10.1145/183432.183527. S2CID  6897138. Архивировано из оригинал (PDF) на 2018-05-18. Получено 2018-05-18.
  16. ^ Статистическая неточность гпроф Выход В архиве 2012-05-29 в Wayback Machine
  17. ^ «Популярные профилировщики C #». Gingtage. 2014 г.
  18. ^ «Профилировщик выборки - Обзор». Справочник AQTime 8. Программное обеспечение SmartBear. 2018.
  19. ^ Вензал, Майра; и другие. (2017). «Обзор профилирования». Справочник по неуправляемому API Microsoft .NET Framework. Microsoft.
  20. ^ «Инструменты производительности». Инструменты разработчика Apple. Apple, Inc., 2013 г.
  21. ^ Нетто, Занелла; Арнольд, Райан С. (2012). «Оцените производительность Linux on Power». IBM DeveloperWorks.
  22. ^ Шмидл, Дирк; Тербовен, Кристиан; Мей, Дитер; Мюллер, Маттиас С. (2013). Пригодность средств повышения производительности для параллельных задач OpenMP. Proc. 7-й международный семинар по параллельным инструментам для высокопроизводительных вычислений. С. 25–37. ISBN  9783319081441.
  23. ^ Карлтон, Гэри; Киркегор, Кнуд; Сер, Дэвид (1998). «Профильная оптимизация». Журнал доктора Добба.

внешняя ссылка