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... произвел революцию в области анализа производительности и быстро стал инструментом выбора для разработчиков по всему миру... инструмент по-прежнему имеет большое количество последователей... инструмент по-прежнему активно поддерживается и остается актуальным в современном мире».
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )