Программирование для 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),
Поделиться:
Популярные книги
Хранилище
5. Лесовик
Фантастика:
фэнтези
рпг
7.43
рейтинг книги
Кодекс Охотника. Книга XXIX
29. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 9
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Громовая поступь. Трилогия
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Эпоха Опустошителя. Том II
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Беглец
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Государь
3. Рюрикова кровь
Фантастика:
мистика
альтернативная история
историческое фэнтези
6.25
рейтинг книги
По осколкам твоего сердца
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
Чехов. Книга 2
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Аспирант
3. Рунный маг
Фантастика:
боевая фантастика
4.50
рейтинг книги
Путь к бессмертию 2
2. Девятихвостый Богатырь
Фантастика:
попаданцы
сказочная фантастика
фэнтези
5.00
рейтинг книги
Дважды одаренный. Том VI
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Развод в 45. От любви до ненависти
6. Развод
Любовные романы:
остросюжетные любовные романы
5.40
рейтинг книги
Отряд
5. Ермак
Фантастика:
альтернативная история
5.25