Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Сбор событий программы [ править ]

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

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

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

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

-  АТОМ, ПЛДИ , '94

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

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

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

История [ править ]

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

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

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

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

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

Плоский профайлер [ править ]

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

Профилировщик графика звонков [ править ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Инструменты [ править ]

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

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

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

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

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

Гипервизор / Симулятор [ править ]

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

См. Также [ править ]

  • Алгоритмическая эффективность
  • Контрольный показатель
  • Производительность Java
  • Список инструментов анализа производительности
  • PAPI - это переносимый интерфейс (в виде библиотеки) к аппаратным счетчикам производительности на современных микропроцессорах.
  • Инженерия производительности
  • Прогноз производительности
  • Настройка производительности
  • Проверка во время выполнения
  • Профильная оптимизация
  • Статический анализ кода
  • Программная археология
  • Время исполнения в наихудшем случае (WCET)

Ссылки [ править ]

  1. ^ "Как найти узкое место производительности в настольном приложении C #?" . Переполнение стека . 2012 г.
  2. ^ Краусс, Кирк J (2017). «Профилирование производительности с фокусом» . Развивайте для повышения производительности.
  3. ^ «Что такое профилирование кода? Изучите 3 типа профилировщиков кода» . Stackify Советы, уловки и ресурсы для разработчиков . Disqus. 2016 г.
  4. ^ Лоуренс, Эрик (2016). «Начало работы с оптимизацией по профилям» . testslashplain . WordPress.
  5. ^ Краусс, Кирк (2018). «Подстановочные знаки соответствия: улучшенный алгоритм для больших данных» . Развивайте для повышения производительности.
  6. ^ «Список профилировщиков .Net: 3 различных типа и зачем они вам нужны» . Stackify Советы, уловки и ресурсы для разработчиков . Disqus. 2016 г.
  7. ^ Руководство программиста Unix, 4-е издание
  8. ^ a b SL Graham, PB Kessler, and MK McKusick, gprof: a Call Graph Execution Profiler , Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices , Vol. 17, № 6, стр. 120–126; DOI: 10.1145 / 800230.806987
  9. A. Srivastava и A. Eustace, ATOM: A system for building custom program analysis tools , Proceedings of the ACM SIGPLAN Conference on Programming language design and implementation (PLDI '94), pp. 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. E. Coppa, C. Demetrescu, I. Finocchi, Input-Sensitive Profiling , 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. DOI : 10.1145 / 183432.183527 . S2CID 6897138 . Архивировано из оригинального (PDF) 18 мая 2018 года . Проверено 18 мая 2018 .  
  16. ^ Статистическая неточность вывода gprof, заархивированная 29 мая 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 on Power» . IBM DeveloperWorks .
  22. ^ Шмидл, Дирк; Тербовен, Кристиан; Мей, Дитер; Мюллер, Маттиас С. (2013). Пригодность средств повышения производительности для параллельных задач OpenMP . Proc. 7-й международный семинар по параллельным инструментам для высокопроизводительных вычислений. С. 25–37. ISBN 9783319081441.
  23. ^ Карлтон, Гэри; Киркегор, Кнуд; Сер, Дэвид (1998). «Профильная оптимизация» . Журнал доктора Добба .

Внешние ссылки [ править ]

  • Статья « Потребность в скорости - Устранение узких мест в производительности », посвященная анализу времени выполнения Java-приложений с помощью IBM Rational Application Developer .
  • Профилирование кода, созданного и интерпретируемого во время выполнения, с помощью анализатора производительности VTune