Ключ | Назначение |
---|---|
-а | 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()
вызывается 10 раз (см. поле calls). В свою очередь, она вызывает функцию 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. Перепишите функцию (или функции), которые занимают больше всего процессорного времени. Возможно, вам придется изменить алгоритм работы этих функций.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии