Профилирование (компьютерное программирование)
Эта статья нуждается в дополнительных цитатах для проверки . ( январь 2009 г. ) |
Часть серии о |
Разработка программного обеспечения |
---|
В обеспечения разработке программного профилирование («профилирование программы», «профилирование программного обеспечения») — это форма динамического анализа программы , которая измеряет, например, пространственную (память) или временную сложность программы , использование определенных инструкций или частоту и продолжительность вызовов функций. Чаще всего информация профилирования служит для оптимизации программы и, в частности, для повышения производительности .
Профилирование достигается путем инструментирования программы исходного кода или ее двоичной исполняемой формы с помощью инструмента, называемого профилировщиком (или профилировщиком кода ). Профилировщики могут использовать ряд различных методов, таких как методы, основанные на событиях, статистические, инструментальные и методы моделирования.
Сбор событий программы
[ редактировать ]Профилировщики используют широкий спектр методов для сбора данных, включая аппаратные прерывания , инструментирование кода , моделирование набора команд операционной системы , перехваты и счетчики производительности .
Использование профилировщиков
[ редактировать ]Инструменты анализа программы чрезвычайно важны для понимания поведения программы. Компьютерным архитекторам нужны такие инструменты, чтобы оценить, насколько хорошо программы будут работать на новых архитектурах . Разработчикам программного обеспечения нужны инструменты для анализа своих программ и определения критических участков кода. Авторы компиляторов часто используют такие инструменты, чтобы узнать, насколько хорошо планирования инструкций или предсказания ветвей ... работает их алгоритм
— АТОМ, ПЛДИ
Результатом профилирования может быть:
- Статистическая сводка наблюдаемых событий ( профиль )
- Сводная информация профиля часто отображается с примечаниями к операторам исходного кода, в которых происходят события, поэтому размер данных измерений линейно зависит от размера кода программы.
/* ------------ source------------------------- count */ 0001 IF X = "A" 0055 0002 THEN DO 0003 ADD 1 to XCOUNT 0032 0004 ELSE 0005 IF 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] (Инструменты анализа с OM). Платформа ATOM преобразует программу в собственный профилировщик: во время компиляции она вставляет в программу код для анализа. Этот вставленный код выводит данные анализа. Этот метод — изменение программы для анализа самой себя — известен как « инструментация ».
В 2004 году оба gprof
и документы ATOM вошли в список 50 самых влиятельных документов PLDI за 20-летний период, закончившийся в 1999 году. [10]
Типы профилировщиков на основе выходных данных
[ редактировать ]Плоские профили
[ редактировать ]Плоские профилировщики вычисляют среднее время вызовов на основе вызовов и не разбивают время вызовов в зависимости от вызываемого абонента или контекста.
Профилировщик графа вызовов
[ редактировать ]графов вызовов Профилировщики [8] показывать время вызовов и частоту выполнения функций, а также задействованные цепочки вызовов в зависимости от вызываемого абонента. В некоторых инструментах полный контекст не сохраняется.
Чувствительный к вводу профилировщик
[ редактировать ]Профилировщики, чувствительные к вводу [11] [12] [13] добавьте дополнительное измерение в плоские профилировщики или профилировщики на основе графа вызовов, связав показатели производительности с особенностями входных рабочих нагрузок, такими как размер входных данных или входные значения. Они создают диаграммы, которые характеризуют, как производительность приложения масштабируется в зависимости от входных данных.
Детализация данных в типах профилировщиков
[ редактировать ]Профайлеры, которые сами по себе являются программами, анализируют целевые программы, собирая информацию об их выполнении. В зависимости от детализации данных и того, как профилировщики собирают информацию, они классифицируются на профилировщики, основанные на событиях, или статистические. Профилировщики прерывают выполнение программы для сбора информации, что может привести к ограниченному разрешению измерений времени, к которым следует относиться с недоверием. Базовые профилировщики блоков сообщают о количестве машинных тактов, посвященных выполнению каждой строки кода, или о времени, основанном на их суммировании; тайминги, сообщаемые для каждого базового блока, могут не отражать разницу между в кэше . попаданиями и промахами [14] [15]
Профилировщики на основе событий
[ редактировать ]Перечисленные здесь языки программирования имеют профилировщики на основе событий:
- Java : API JVMTI (Интерфейс инструментов JVM), ранее известный как JVMPI (Интерфейс профилирования JVM), предоставляет профилировщикам перехватчики для перехвата таких событий, как вызовы, загрузка классов, выгрузка, вход в поток и выход.
- .NET : можно подключить агент профилирования в качестве COM- сервера к CLR профилирования с помощью API . Как и в случае с Java, среда выполнения затем предоставляет агенту различные обратные вызовы для перехвата таких событий, как метод JIT /вход/выход, создание объекта и т. д. Особенно мощная возможность заключается в том, что агент профилирования может перезаписывать байт-код целевого приложения произвольными способами.
- Python : профилирование Python включает модуль профиля hotshot (основанный на графе вызовов) и использование функции sys.setprofile для перехвата таких событий, как c_{call,return,Exception}, python_{call,return,Exception}.
- Ruby : Ruby также использует для профилирования интерфейс, аналогичный Python. Присутствуют Flat-profiler в Profile.rb, модуль и C-расширение Ruby-Prof.
Статистические профайлеры
[ редактировать ]Некоторые профилировщики работают путем выборки . целевой программы Профилировщик выборки проверяет стек вызовов через регулярные промежутки времени, используя операционной системы прерывания . Профили выборки обычно менее точны и конкретны в числовом отношении, но позволяют целевой программе работать практически на полной скорости.
Полученные данные являются не точными, а статистическим приближением. «Фактическая величина ошибки обычно превышает один период выборки. Фактически, если значение в n раз превышает период выборки, ожидаемая ошибка в нем равна квадратному корню из n периодов выборки». [16]
На практике профилировщики выборки часто могут предоставить более точную картину выполнения целевой программы, чем другие подходы, поскольку они не так навязчивы целевой программе и, следовательно, не имеют такого большого количества побочных эффектов (например, на кэши памяти или инструкции). конвейеры декодирования). Кроме того, поскольку они не так сильно влияют на скорость выполнения, они могут обнаруживать проблемы, которые в противном случае были бы скрыты. Они также относительно невосприимчивы к переоценке стоимости небольших, часто называемых процедур или «жестких» циклов. Они могут показывать относительное количество времени, затраченное в пользовательском режиме, по сравнению с прерываемым режимом ядра, например, на обработку системных вызовов .
Тем не менее, код ядра для обработки прерываний влечет за собой незначительную потерю циклов ЦП, перенаправление использования кэша и неспособность различать различные задачи, происходящие в бесперебойном коде ядра (активность в микросекундном диапазоне).
Специальное оборудование может пойти дальше: интерфейс JTAG ARM Cortex-M3 и некоторых последних процессоров MIPS имеет регистр PCSAMPLE, который производит выборку счетчика программ действительно необнаружимым образом, позволяя ненавязчиво собирать плоский профиль.
Некоторые часто используемые [17] статистические профилировщики для Java/управляемого кода — это SmartBear Software. от AQtime [18] и Microsoft от CLR Profiler . [19] Эти профилировщики также поддерживают профилирование собственного кода, наряду с Apple Inc. от Shark (OSX) [20] Опрофиль (Linux), [21] Intel VTune и Parallel Amplifier (часть Intel Parallel Studio ), а также Oracle Performance Analyzer , [22] среди других.
Инструментарий
[ редактировать ]Этот метод эффективно добавляет в целевую программу инструкции для сбора необходимой информации. Обратите внимание, что инструментирование программы может привести к изменениям производительности и в некоторых случаях может привести к неточным результатам и/или ошибкам . Эффект будет зависеть от того, какая информация собирается, от уровня детализации временных данных, а также от того, используется ли базовое профилирование блоков в сочетании с инструментами. [23] Например, добавление кода для подсчета каждого вызова процедуры/подпрограммы, вероятно, будет иметь меньший эффект, чем подсчет количества выполнений каждого оператора. Некоторые компьютеры имеют специальное оборудование для сбора информации; в этом случае влияние на программу минимально.
Инструментирование является ключом к определению уровня контроля и временного разрешения, доступного профилировщикам.
- Вручную : выполняется программистом, например, путем добавления инструкций для явного расчета времени выполнения, простого подсчета событий или вызовов API-интерфейсов измерения, таких как стандарт измерения отклика приложения .
- Уровень автоматического исходного кода : инструментарий, добавляемый в исходный код автоматическим инструментом в соответствии с политикой инструментирования.
- Промежуточный язык : инструментарий, добавленный в ассемблер или декомпилированные байт-коды, обеспечивающий поддержку нескольких исходных языков более высокого уровня и позволяющий избежать (несимволических) проблем перезаписи двоичного смещения.
- С помощью компилятора
- Двоичная трансляция : инструмент добавляет инструменты к скомпилированному исполняемому файлу .
- Инструментирование во время выполнения : непосредственно перед выполнением код инструментируется. Запуск программы полностью контролируется инструментом.
- Внедрение во время выполнения : более легкое, чем инструменты во время выполнения. Код модифицируется во время выполнения, чтобы иметь возможность перехода к вспомогательным функциям.
Инструментарий переводчика
[ редактировать ]- Параметры отладки интерпретатора позволяют собирать показатели производительности при обнаружении интерпретатором каждого целевого оператора. Байт -код , управляющая таблица или JIT- интерпретаторы — это три примера, которые обычно имеют полный контроль над выполнением целевого кода, что обеспечивает чрезвычайно широкие возможности сбора данных.
Гипервизор/симулятор
[ редактировать ]- Гипервизор : данные собираются путем запуска (обычно) неизмененной программы под гипервизором . Пример: СИММОН
- Симулятор и гипервизор : данные собираются в интерактивном режиме и выборочно путем запуска немодифицированной программы под управлением симулятора с набором команд .
См. также
[ редактировать ]- Алгоритмическая эффективность
- Контрольный показатель
- Производительность Java
- Список инструментов анализа производительности
- PAPI — это портативный интерфейс (в виде библиотеки) к аппаратным счетчикам производительности современных микропроцессоров.
- Проектирование производительности
- Прогноз производительности
- Настройка производительности
- Проверка времени выполнения
- Оптимизация на основе профиля
- Статический анализ кода
- Программная археология
- Время выполнения наихудшего случая (WCET)
Ссылки
[ редактировать ]- ^ «Как найти узкое место в производительности настольного приложения C#?» . Переполнение стека . 2012.
- ^ Краусс, Кирк Дж (2017). «Профилирование производительности с фокусом» . Развивайтесь ради производительности.
- ^ «Что такое профилирование кода? Изучите 3 типа профилировщиков кода» . Советы, подсказки и ресурсы для разработчиков Stackify . Дискус. 2016.
- ^ Лоуренс, Эрик (2016). «Начало работы с оптимизацией по профилям» . тестыlashplain . WordPress.
- ^ Краусс, Кирк (2018). «Сопоставление подстановочных знаков: улучшенный алгоритм для больших данных» . Развивайтесь ради производительности.
- ^ «Список профилировщиков .Net: 3 разных типа и почему они все вам нужны» . Советы, подсказки и ресурсы для разработчиков Stackify . Дискус. 2016.
- ^ Руководство программиста Unix, 4-е издание
- ^ Jump up to: Перейти обратно: а б С. Л. Грэм, П. Б. Кесслер и М. К. МакКузик, gprof: профилировщик выполнения графа вызовов , Труды симпозиума SIGPLAN '82 по построению компилятора, SIGPLAN Уведомления , Vol. 17, № 6, стр. 120-126; дои: 10.1145/800230.806987
- ^ А. Шривастава и А. Юстас, ATOM: Система для создания индивидуальных инструментов анализа программ , Материалы конференции ACM SIGPLAN по разработке и реализации языков программирования (PLDI '94), стр. 196-205, 1994; ACM Уведомления SIGPLAN — Лучшее из PLDI за 1979–1999 гг. Архив домашней страницы, Vol. 39, № 4, стр. 528-539; дои: 10.1145/989393.989446
- ^ 20 лет PLDI (1979–1999): Выбор , Кэтрин С. МакКинли , редактор
- ^ Э. Коппа, К. Деметреску и И. Финокки, Профилирование с учетом входных данных , IEEE Trans. Программное обеспечение англ. 40(12): 1185-1205 (2014); doi:10.1109/TSE.2014.2339825
- ^ Д. Запаранукс и М. Хаусвирт, Алгоритмическое профилирование , Материалы 33-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI 2012), Уведомления ACM SIGPLAN, Vol. 47, № 6, стр. 67–76, 2012 г.; дои: 10.1145/2254064.2254074
- ^ Т. Кустнер, Дж. Вайдендорфер и Т. Вайнцирль, Профилирование, управляемое аргументами , Труды Euro-Par 2009 - Семинары по параллельной обработке, Конспекты лекций по информатике, Vol. 6043, стр. 177–184, 2010 г.; doi:10.1007/978-3-642-14122-5 22
- ^ «Время и профилирование — профилировщики базовых блоков» . Архив OpenStax CNX .
- ^ Болл, Томас; Ларус, Джеймс Р. (1994). «Оптимальное профилирование и отслеживание программ» (PDF) . Транзакции ACM в языках и системах программирования . 16 (4). Цифровая библиотека ACM: 1319–1360. дои : 10.1145/183432.183527 . S2CID 6897138 . Архивировано из оригинала (PDF) 18 мая 2018 г. Проверено 18 мая 2018 г.
- ^ Статистическая неточность
gprof
Вывод заархивирован 29 мая 2012 г. на Wayback Machine. - ^ «Популярные профилировщики C#» . Джинтаж. 2014.
- ^ «Профилировщик выборки — обзор» . Справочник по AQTime 8 . Программное обеспечение SmartBear. 2018.
- ^ Вензал, Майра; и др. (2017). «Обзор профилирования» . Справочник по неуправляемому API Microsoft .NET Framework . Майкрософт.
- ^ «Инструменты производительности» . Инструменты разработчика Apple . Apple, Inc., 2013 г.
- ^ Нетто, Занелла; Арнольд, Райан С. (2012). «Оценка производительности Linux on Power» . IBM DeveloperWorks .
- ^ Шмидл, Дирк; Тербовен, Кристиан; ан Мей, Дитер; Мюллер, Матиас С. (2013). Пригодность инструментов производительности для программ OpenMP, реализующих параллельные задачи . Учеб. 7-й международный семинар по параллельным инструментам для высокопроизводительных вычислений. стр. 25–37. ISBN 9783319081441 .
- ^ Карлтон, Гэри; Киркегор, Кнуд; Сер, Дэвид (1998). «Оптимизация на основе профиля» . Доктор Журнал Добба .
Внешние ссылки
[ редактировать ]- Статья « Жажда скорости — устранение узких мест в производительности » о выполнении анализа времени выполнения Java-приложений с помощью IBM Rational Application Developer .
- Профилирование сгенерированного и интерпретированного кода во время выполнения с помощью анализатора производительности VTune