Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

А.3.2. Сбор профильной информации

Первый этап профилирования заключается в настройке исполняемого файла на сбор профильной информации. Для этого при компиляции и компоновке объектных файлов необходимо указывать флаг

– pg
. Рассмотрим, к примеру, такую последовательность команд:

% gcc -pg -c -o calculator.o calculator.c

% gcc -pg -c -o stack.o stack.c

% gcc -pg -c -o number.o number.c

% gcc -pg calculator.o stack.o number.o -o calculator

Здесь разрешается сбор информации о вызовах функций и времени их выполнения. Чтобы получать сведения о каждой выполняемой строке программы, укажите флаг

– g
. При наличии флага
– a
будет подсчитываться количество итераций циклов.

На втором этапе требуется запустить программу. В процессе ее выполнения профильные данные накапливаются в файле

gmon.out
. Исследуются только те участки программы, которые действительно выполняются. Чтобы профильный файл был записан, программа должна завершиться нормальным образом.

А.3.3. Отображение профильных данных

Получив имя исполняемого файла, утилита

gprof
проверяет файл
gmon.out
и отображает информацию о том, сколько времени заняло выполнение каждой функции. Давайте проанализируем ход выполнения операции 1787 × 13 - 1918 в нашей программе-калькуляторе, создав простой профиль.

Flat profile:

Each sample counts as 0.01 seconds.

% cumulative self self total

time seconds seconds calls ms/call ms/call name

26.07 1.76 1.76 20795463 0.00 0.00 decrement_number

24.44 3.41 1.65 1787 0.92 1.72 add

19.85 4.75 1.34 62413059 0.00 0.00 zerop

15.11 5.77 1.02 1792 0.57 2.05 destroy_number

14.37 6.74 0.97 20795463 0.00 0.00 add_one

 0.15 6.75 0.01 1788 0.01 0.01 copy_number

 0.00 6.75 0.00 1792 0.00 0.00 make_zero

 0.00 6.75 0.00 11 0.00 0.00 empty_stack

Вычисление функции

decrement_number
и всех вызываемых в ней функций заняло 26,07% общего времени выполнения программы. Эта функция вызывалась 20795463 раза. Каждый вызов выполнялся 0,00 с, т.е. столь малое время, что его не удалось замерить. Функция
add
вызывалась 1787 раз, очевидно для вычисления произведения. Каждый проход по функции занимал 0,92 секунды. Функция
copy_number
вызывалась почти столько же раз — 1788, но на ее выполнение ушло всего 0.15% общего времени работы программы. Иногда в отчете присутствуют функции
mcount
и
profil
, используемые профайлером.

В простом профиле отражается время, затраченное на выполнение каждой функции. Утилита

gprof
умеет также создавать схему вызовов, где показывается время, проведенное не только в каждой функции, но и во всех вызываемых в ее контексте дочерних функциях.

index % time self children called name

<spontaneous>

[1] 100.0 0.00 6.75 main [1]

0.00 6.75 2/2 apply_binary_function [2]

0.00 0.00 1/1792 destroy_number [4]

0.00 0.00 1/1 number_to_unsigned_int [10]

0.00 0.00 3/3 string_to_number [12]

0.00 0.00 3/5 push_stack [16]

0.00 0.00 1/1 create_stack [16]

0.00 0.00 1/11 empty_stack [14]

0.00 0.00 1/5 pop_stack [15]

0.00 0.00 1/1 clear_stack [17]

– -------------------------------------

0.00 6.75 2/2 main [1]

[2] 100.0 0.00 6.75 2 apply_binary_function [2]

0.00 6.74 1/1 product [3)

0.00 0.01 4/1792 destroy_number [4]

0.00 0.00 1/1 subtract [11]

  • Читать дальше
  • 1
  • ...
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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