Вход/Регистрация
Linux: Полное руководство
вернуться

Аллен Питер В.

Шрифт:

Стандартные константы выводятся в их символьном представлении:

open("file.dat", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3

Сигналы также выводятся в символьном представлении, например:

sigsuspend([] <unfinished ...>

– -- SIGINT (Interrupt) ---

+++ killed by SIGINT +++

Структуры, точнее члены структур, заключаются в фигурные скобки и выводятся в формате имя_члена=значение, например:

lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) =0

Символьные указатели печатаются как строки в С, то есть их значения заключены в двойные кавычки:

read(3, "root::0:0:System Administrator:/"..., 1024) = 422

22.5. Оптимизация программ. Профайлер gprof

Ваша программа работает медленно? Скорее всего, причина кроется в неэффективном, медленном алгоритме. Существуют программы, позволяющие определить время работы каждой функции вашей программы и всей программы в целом. Программы такого рода называются профайлерами. В вашем дистрибутиве может присутствовать один из профайлеров gprof, prof, profiler.

Сейчас мы рассмотрим программу gprof (The GNU Profiler), позволяющую определить время работы каждой функции. Основные ключи программы представлены в таблице 22.3.

Ключи командной строки gprof Таблица 22.3

Ключ Назначение
– а 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 <stdio.h>

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
содержит время этой функции и всех родительских.

  • Читать дальше
  • 1
  • ...
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: