Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

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

Шрифт:

0.00 0.00 4/11 empty_stack [14]

0.00 0.00 4/5 pop_stack [15]

0.00 0.00 2/5 push_stack [16]

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

0.00 6.74 1/1 apply_binary_function [2]

[3] 99.6 0.00 6.74 1 product [3]

1.02 2.65 1767/1792 destroy_number [4]

1.65 1.43 1767/1767 add [5]

0.00 0.00 1760/62413059 zerop [7]

0.00 0.00 1/1792 make_zero [13]

В первой секции сообщается о том, что на выполнение функции

main
и всех ее дочерних функций ушло 100% времени (6.75 секунд). Функцию
main
вызвал некто
<spontaneous>
: это означает, что профайлер не смог определить, как был осуществлен вызов. В функции
main
дважды вызывалась функция
apply_binary_function
(всего таких вызовов в программе было тоже два). В третьей секции сообщается о том, что выполнение функции
product
и ее дочерних функций заняло 98% времени. Эта функция вызывалась только один раз из функции
apply_binary_function
.

По схеме вызовов несложно определить время работы той или иной функции. Однако рекурсивные функции требуют особого подхода. Например, функция

even
вызывает функцию
odd
, а та — снова функцию
even
. Самому длинному из таких циклов присваивается номер и выделяется отдельная секция отчета. Следующий фрагмент профильных данных получен в результате проверки того, является ли результат операции 1787 × 13 × 3 четным:

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

0.00 0.02 1/1 main [1]

[9] 0.1 0.00 0.02 1 apply_unary_function [9]

0.01 0.00 1/1 even <cycle 1> [13]

0.00 0.00 1/1806 destroy_number [5]

0.00 0.00 1/13 empty_stack [17]

0.00 0.00 1/6 pop_stack [16]

0.00 0.00 1/6 push_stack [19]

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

[10] 0.1 0.01 0.00 1+69993 <cycle 1 as a whole> [10]

0.00 0.00 34647 even <cycle 1> [13]

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

34847 even <cycle 1> [13]

[11] 0.1 0.01 0.00 34847 odd <cycle 1> [11]

0.00 0.00 34847/186997954 zerop [7]

0.00 0.00 1/1806 make_zero [16]

34846 even <cycle 1> [13]

Выражение

1+69693
в секции 10 сообщает о том что цикл 1 выполнялся один раз и в нем насчитывается 69693 обращений к функциям. Первой в цикле вызывалась функция
even
, а из нее — функция
odd
. Обе функции вызывались по 34847 раз.

Утилита

gprof
располагает рядом полезных опций.

■ При задании опции

– s
будут суммироваться результаты нескольких запусков программы.

■ С помощью опции

– c
можно узнать, какие дочерние функции могли быть, но так и не были вызваны

■ При задании опции

– l
отображается построчная профильная информация.

■ При задании опции

– A
будет отображен исходный текст программы, сопровождаемый процентными показателями времени выполнения.

А.3.4. Как работает утилита gprof

Схема работы утилиты

gprof
выглядит следующим образом. Когда в ходе выполнения программы происходит вызов функции, счётчик обращений к функции увеличивается на единицу. Утилита периодически прерывает программу, чтобы выяснить, какая функция выполняется в данный момент. На основании этих '"выборок" и определяется время выполнения. В Linux тактовые импульсы генерируются с интервалом 0,01 с, следовательно, это наименьший промежуток между прерываниями. Таким образом, профильные данные о слишком быстро выполняющихся функциях могут оказаться неточными. Во избежание погрешностей рекомендуется запускать программу на длительные периоды времени или суммировать профильные данные по результатам нескольких запусков (это делается с помощью опции
– s
).

А.3.5. Исходные тексты программы-калькулятора

В листинге А.3 показан текст программы, вычисляющей значения постфиксных выражений.

Листинг А.3. (calculator.c) Основная часть программы-калькулятора

/* Вычисления в унарном формате. */

/* На вход программы подаются однострочные выражения

в обратной польской (постфиксной) записи, например:

602 7 5 - 3 * +

Вводимые числа должны быть неотрицательными

десятичными числами. Поддерживаются операторы

"+", "-" и "*". Унарные операторы "even" и "odd"

возвращают значение 1 в том случае, когда операнд

является четным или нечетным соответственно.

Лексемы разделяются пробелами. Отрицательные числа

не поддерживаются. */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include "definitions.h"

/* Эта функция выполняет указанную бинарную операцию над

операндами, извлекаемыми из стека, помещая результат

обратно в стек, в случае успеха возвращается

ненулевое значение. */

int apply_binary_function(number (*function)(number, number),

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

Воспоминания о Корнее Чуковском

Коллектив авторов
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Воспоминания о Корнее Чуковском

Драйв Астарты

Розов Александр Александрович
5. Конфедерация Меганезия
Фантастика:
фэнтези
5.00
рейтинг книги
Драйв Астарты

Пески веков (сборник)

Уиндем Джон Паркс Лукас Бейнон Харрис
1970. Зарубежная фантастика
Фантастика:
научная фантастика
5.00
рейтинг книги
Пески веков (сборник)

Бастард Императора. Том 3

Орлов Андрей Юрьевич
3. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 3

#Бояръ-Аниме. Газлайтер. Том 36

Володин Григорий Григорьевич
36. История Телепата
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 36

Рассказы

Крапивин Владислав Петрович
Детские:
прочая детская литература
5.00
рейтинг книги
Рассказы

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Офицер

Земляной Андрей Борисович
1. Офицер
Фантастика:
боевая фантастика
7.21
рейтинг книги
Офицер

Я – Легенда 2: геном хищника

Гарцевич Евгений Александрович
2. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Я – Легенда 2: геном хищника

Древесный маг Орловского княжества 4

Павлов Игорь Васильевич
4. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 4