stringtranslate.com

Gprof

Gprof — это инструмент анализа производительности для приложений Unix . Он использовал гибрид инструментирования и выборки [1] и был создан как расширенная версия старого инструмента "prof". В отличие от prof, gprof способен собирать и печатать ограниченные графы вызовов . [1] [2]

История

GPROF изначально был написан группой под руководством Сьюзан Л. Грэм в Калифорнийском университете в Беркли для Berkeley Unix ( 4.2BSD [3] ). Другая реализация была написана как часть проекта GNU для GNU Binutils в 1988 году Джеем Фенласоном. [4] [5]

Выполнение

Код инструментария автоматически вставляется в программный код во время компиляции (например, с помощью -pgопции ' ' компилятора gcc ), чтобы собрать данные вызывающей функции. Вызов функции монитора 'mcount' вставляется перед каждым вызовом функции. [6]

Данные выборки сохраняются в файле 'gmon.out' или в файле ' progname .gmon' непосредственно перед выходом из программы и могут быть проанализированы с помощью gprofинструмента командной строки ' '. Несколько файлов gmon можно объединить с ' gprof -s' для накопления данных из нескольких запусков программы.

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

Вторая часть вывода — это текстовый граф вызовов, который показывает для каждой функции, кто ее вызвал (родительская функция) и кого она вызвала (дочерние подпрограммы). Существует внешний инструмент под названием gprof2dot, способный преобразовать граф вызовов из gprof в графическую форму. [7]

Ограничения и точность

Во время выполнения значения времени получаются путем статистической выборки. Выборка выполняется путем зондирования счетчика программ целевой программы через регулярные интервалы времени с использованием прерываний операционной системы (программируемых через системные вызовы profil(2) или setitimer(2) ). Полученные данные не являются точными, а представляют собой статистическую аппроксимацию. Количество ошибок обычно больше одного периода выборки. Если значение в n раз больше периода выборки, ожидаемая ошибка в значении равна квадратному корню из n периодов выборки. [8] [9] Типичный период выборки составляет 0,01 секунды (10 миллисекунд) или 0,001 секунды (1 мс) или, другими словами, 100 или 1000 выборок в секунду рабочего времени ЦП.

В некоторых версиях, таких как BSD, профилирование общих библиотек может быть ограничено из-за ограничений функции profil , которая может быть реализована как библиотечная функция или как системный вызов. В glibc были аналогичные утилиты под названием 'sprof' для профилирования динамических библиотек. [10]

Gprof не может измерить время, проведенное в режиме ядра (системные вызовы, ожидание ЦП или ожидание ввода-вывода), и профилируется только код пользовательского пространства. [9]

Функция mcount может быть не потокобезопасной в некоторых реализациях, поэтому профили многопоточных приложений могут быть неверными (обычно она профилирует только основной поток приложения). [11]

Накладные расходы на инструментирование могут быть высокими (оцениваются как 30% [12] -260% [13] ) для программ более высокого порядка или объектно-ориентированных программ. Взаимная рекурсия и нетривиальные циклы не могут быть разрешены подходом gprof (контекстно-нечувствительный граф вызовов), поскольку он записывает только обход дуг, а не полные цепочки вызовов. [13] [14] [15]

Gprof со сбором графа вызовов можно использовать только с совместимыми компиляторами, такими как GCC, clang/LLVM и некоторыми другими.

Прием

В 2004 году статья GPROF вошла в список 50 самых влиятельных статей PLDI всех времен как одна из четырех статей 1982 года. [16]

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

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

Ссылки

  1. ^ ab Susan L. Graham, Peter B. Kessler и Marshall K. Mckusick. gprof: профилировщик выполнения графа вызовов // Труды симпозиума SIGPLAN '82 по построению компиляторов, уведомления SIGPLAN, том 17, № 6, стр. 120-126; doi: 10.1145/800230.806987
  2. ^ gprof --- Call Graph // Пинг Хуан, Reinventing Computing, MIT AI Lab
  3. ^ ИСТОРИЯ Профайлер gprof появился в 4.2BSD
  4. ^ Руководство по GNU gprof: «GNU gprof был написан Джеем Фенлейсоном».
  5. Бюллетень GNU, т. 1, № 5 (1988): «Заменивший Gprof сотрудник Фонда Джей Фенласон недавно завершил работу над профилировщиком для работы с GNU C, совместимым с `GPROF' из Berkeley Unix».
  6. ^ Джастин Тиль, Обзор инструментов и методов анализа производительности программного обеспечения: от GProf до DTrace (2006) "2.1.1 Обзор GProf"
  7. ^ Визуализация графа вызовов Gprof // Рецепты научных вычислений. Кулинарная книга Python. Федеральная политехническая школа Лозанны (EPFL)
  8. ^ Статистическая неточность вывода .mw-parser-output .monospaced{font-family:monospace,monospace}gprof. Архивировано 29.05.2012 на Wayback Machine.
  9. ^ ab gprof Инструменты профилирования в системах BG/P Архивировано 21 декабря 2013 г. на Wayback Machine , «Проблемы интерпретации данных профиля», Argonne Leadership Computing Facility
  10. ^ "Проект qprof". HP Labs, Research (архив) . Архивировано из оригинала 4 августа 2014 года . Получено 28 сентября 2023 года .{{cite web}}: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )
  11. ^ HOWTO: использование gprof с многопоточными приложениями // Сэм Хосевар, 2004-12-13
  12. ^ GNU gprof Profiler Архивировано 08.12.2015 на Wayback Machine , Ю Кай Хонг, кафедра математики Национального университета Тайваня; 19 июля 2008 г.
  13. ^ ab Профилирование пути вызова с низкими накладными расходами для немодифицированного оптимизированного кода, ACM 1-59593-167/8/06/2005.
  14. ^ JM Spivey Быстрое и точное профилирование графа вызовов Архивировано 07.02.2012 в Wayback Machine , 3 сентября 2003 г. // Архив журнала Software—Practice & Experience, том 34, выпуск 3, март 2004 г., страницы 249–264 Spivey, JM (2004). «Быстрое и точное профилирование графа вызовов». Software: Practice and Experience . 34 (3): 249–264. CiteSeerX 10.1.1.62.1032 . doi :10.1002/spe.562. S2CID  17866706. 
  15. ^ Йосси Крейнин, Как лгут профайлеры: случаи gprof и KCachegrind // 2 февраля 2013 г.
  16. ^ 20 лет PLDI (1979–1999): Избранное, Кэтрин С. МакКинли, редактор

Дальнейшее чтение

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