stringtranslate.com

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

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

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

Программа мероприятий сбора

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

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

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

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

—  АТОМ, ПЛДИ

Выходные данные профилировщика могут быть следующими:

Сводная информация о профиле часто отображается в виде аннотаций напротив операторов исходного кода, в которых происходят события, поэтому размер данных измерений линейен по отношению к размеру кода программы.
/* ------------ источник------------------------- количество */ 0001 ЕСЛИ Х = "А" 00550002 ТОГДА ДЕЛАЙТЕ 0003 ДОБАВИТЬ 1 к XCOUNT 00320004 ИНАЧЕ0005 ЕСЛИ Х = "В" 0055
Для последовательных программ обычно достаточно сводного профиля, но проблемы с производительностью в параллельных программах (ожидание сообщений или проблемы синхронизации) часто зависят от временной взаимосвязи событий, поэтому для понимания происходящего требуется полная трассировка.
Размер (полной) трассировки линейен по отношению к длине пути инструкции программы , что делает ее несколько непрактичной. Поэтому трассировка может быть начата в одной точке программы и завершена в другой точке, чтобы ограничить вывод.
Это дает возможность включать или выключать трассировку в любой желаемой точке во время выполнения в дополнение к просмотру текущих метрик о (все еще выполняющейся) программе. Это также дает возможность приостанавливать асинхронные процессы в критических точках для более детального изучения взаимодействия с другими параллельными процессами.

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

История

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

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

В 1994 году Амитабх Шривастава и Алан Юстас из Digital Equipment Corporation опубликовали статью, описывающую ATOM [9] (Analysis Tools with OM). Платформа ATOM преобразует программу в свой собственный профайлер: во время компиляции она вставляет код в программу для анализа. Этот вставленный код выводит данные анализа. Эта техника — изменение программы для анализа самой себя — известна как « инструментация ».

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

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

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

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

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

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

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

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

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

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

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

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

Статистические профайлеры

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

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

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

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

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

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

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

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

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

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

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

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

Ссылки

  1. ^ «Как найти узкое место производительности в настольном приложении C#?». Stack Overflow . 2012.
  2. ^ Краусс, Кирк Дж. (2017). «Профилирование производительности с фокусом». Разработка для производительности.
  3. ^ "Что такое профилирование кода? Изучите 3 типа профилировщиков кода". Советы, рекомендации и ресурсы для разработчиков Stackify . Disqus. 2016.
  4. ^ Лоуренс, Эрик (2016). «Начало работы с профильной оптимизацией». testslashplain . WordPress.
  5. ^ Краусс, Кирк (2018). «Соответствие подстановочных знаков: улучшенный алгоритм для больших данных». Разработка для производительности.
  6. ^ «Список профилировщиков .Net: 3 различных типа и почему вам нужны все они». Советы, рекомендации и ресурсы для разработчиков Stackify . Disqus. 2016.
  7. ^ Руководство программиста Unix, 4-е издание
  8. ^ ab SL Graham, PB Kessler и MK McKusick, gprof: профилировщик выполнения графа вызовов, Труды симпозиума SIGPLAN '82 по построению компиляторов, SIGPLAN Notices , том 17, № 6, стр. 120-126; doi:10.1145/800230.806987
  9. ^ А. Шривастава и А. Юстас, ATOM: Система для создания настраиваемых инструментов анализа программ, Труды конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI '94), стр. 196-205, 1994; ACM SIGPLAN Notices - Best of PLDI 1979-1999 Homepage archive, Vol. 39, No. 4, стр. 528-539; doi:10.1145/989393.989446
  10. ^ 20 лет PLDI (1979–1999): Избранное, Кэтрин С. МакКинли , редактор
  11. ^ Э. Коппа, К. Деметреску и И. Финокки, Профилирование с учетом входных данных, IEEE Trans. Программное обеспечение англ. 40(12): 1185-1205 (2014); doi:10.1109/TSE.2014.2339825
  12. ^ Д. Запаранукс и М. Хаусвирт, Алгоритмическое профилирование , Труды 33-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI 2012), ACM SIGPLAN Notices, том 47, № 6, стр. 67-76, 2012; doi:10.1145/2254064.2254074
  13. ^ T. Kustner, J. Weidendorfer и T. Weinzierl, Профилирование с контролем аргументов , Труды Euro-Par 2009 – Семинары по параллельной обработке, Конспект лекций по информатике, том 6043, стр. 177-184, 2010; doi:10.1007/978-3-642-14122-5 22
  14. ^ "Время и профилирование - Базовые профилировщики блоков". Архив OpenStax CNX .
  15. ^ Болл, Томас; Ларус, Джеймс Р. (1994). «Оптимальное профилирование и трассировка программ» (PDF) . Труды ACM по языкам и системам программирования . 16 (4). Цифровая библиотека ACM: 1319–1360. doi :10.1145/183432.183527. S2CID  6897138. Архивировано из оригинала (PDF) 2018-05-18 . Получено 2018-05-18 .
  16. ^ Статистическая неточность вывода gprof Архивировано 29.05.2012 на 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 на Power». IBM DeveloperWorks .
  22. ^ Шмидл, Дирк; Тербовен, Кристиан; Мей, Дитер; Мюллер, Маттиас С. (2013). Пригодность инструментов производительности для задач OpenMP-параллельных программ. Труды 7-го Международного семинара по параллельным инструментам для высокопроизводительных вычислений. стр. 25–37. ISBN 9783319081441.
  23. ^ Карлтон, Гэри; Киркегор, Кнуд; Сер, Дэвид (1998). «Оптимизация на основе профиля». Журнал доктора Добба .

Внешние ссылки