Ключ | Назначение |
---|---|
-а | He выводить информацию о статических функциях |
-b | Не выводить описание каждого поля в итоговой таблице |
-с | Включить эвристический анализ текстового сегмента объектного файла с целью создания статического графика вызовов |
-e имя_функции | На выводить отчет о работе указанной функции и обо всех функциях, которые из нее вызываются |
-E имя функции | Не обрабатывать указанную функцию и все функции, которые она вызывает |
-f имя_функции | выводить информацию только об указанной функции и обо всех функциях, которые из нее вызываются |
-F имя_функции | Обрабатывать только указанную функцию и все функции, которые из нее вызываются |
-k func1 func2 | Не выводить информацию о вызове функции func2 из функции func1 |
-s | Создание итогового файла gmon.sum |
-z | Вывести функции с нулевым процессорным временем |
22.5.1. Использование профайлера
Для использования профайлера нужно скомпилировать программу с опцией компилятора -pg
и без опции -о. так как профайлер по умолчанию работает с файломa.out
. После этого запустите файл a.out
, чтобы он создал файл gmon.out
. Теперь запустите профайлер с параметром --nograph:$ gcc -pg 1.с
$ ./а.out
$ gprof -b –no-graph
Без ключа -b
профайлер выведет описание полей итоговой таблицы:♦ Time
: время работы функции в процентном соотношении;♦ cumulative seconds
: сумма числа секунд этой функции и вызывающих ее функций;♦ self seconds
: число секунд, потраченное на работу этой функции в отдельности;♦ Calls
: число вызовов;♦ self ms/calls
: количество миллисекунд, на протяжении которых функция выполнялась;♦ total ms/calls
: количество секунд, на протяжении которых выполнялась функция и все функции, которые вызываются данной функцией;♦ name
: имя функции.Рис. 22.5
. Программа gprofЧтобы было понятно, что означает каждое поле, рассмотрим листинг 22.3.
Листинг 22.3. Демонстрационная программа
#include
int function2() {
int i;
/* генерируем задержку */
for (i=0;i<9999999;i++) ;
return 777;
}
double function(void) {
int i;
double x = 7.2323232323, y=324343.3434;
/* генерируем задержку */
for (i=0;i<9999999;i++) x/y;
function2();
return x/y;
}
int main() {
int i;
double l;
for (i=0;i<10;i++) {
printf("%d\b",i);
l=function();
}
return 0;
}
Как видно из листинга, функция function()
function2()
, следовательно, число вызовов этой функции тоже равно 10. Функция function()
выполняется 1.09 секунд (self seconds), а так как ее никто не вызывает (кроме main), то поле cumulative seconds
также равно 1.09. Функция function2()
работает 1.07 секунд, но ее вызывает функция function()
, которая работает 1.09 секунд. Следовательно, поле cumulative seconds
для второй функции равно 1,09+1.07=2.16. Поле self ms/call
эквивалентно полю self seconds
, только его величина представлена в миллисекундах. Поле total ms/call
обратно полю cumulative call
и содержит время выполнения этой функции и всех дочерних функций, в то время как поле cumulative call
содержит время этой функции и всех родительских.22.5.2. Как оптимизировать программу
В качестве оптимизации программы могу вам порекомендовать предпринять следующие действия:
1. Запустите профайлер, и пусть он определит время работы всех функций.
2. Перепишите функцию (или функции), которые занимают больше всего процессорного времени. Возможно, вам придется изменить алгоритм работы этих функций.