В операционных системах Unix-семейства существует несколько полезных утилит, с помощью которых можно быстро осуществить профилирование программы на Си и построить граф, отражающий "стоимость" вызова функций.
Для работы нам понадобятся следующие инструменты:
Для работы нам понадобятся следующие инструменты:
- пакет разработчика gcc;
- профайлер gprof;
- полезный скрипт на Python Gprof2Dot, преобразующий данные профайлера в описание на языке dot;
- пакет визуализации графов graphviz, в частности, программа dot, формирующая изображение графа вызовов функций.
В качестве "испытуемой" напишем небольшую программу их трёх функций:
Суть программы в том, что main вызывает случайным образом то sleep1, то sleep2 с равной вероятностью (что возникает из свойств генератора ПСЧ rand()).
Теперь распишем действия с prof_demo.c
По рисунку видно, что время выполнения программы практически поровну делится между работой sleep1 и sleep2. На домашней страничке проекта Gprof2Dot показана ещё более впечатляющая схема распределения runtime-ресурсов между разными функциями.#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void sleep1(int n)
{
int i,j;
for(i=0;i<n;i++) {
for(j=0;j<n;j++)
;
putchar(',');
}
}
void sleep2(int n)
{
int i,j;
for(i=0;i<n;i++) {
for(j=0;j<n;j++)
;
putchar('.');
}
}
int main()
{
int i;
void (*p[2])(int);
srand(time(0));
p[0]=sleep1;
p[1]=sleep2;
for(i=1;i<1000;i++)
p[rand()%2](i);
return 0;
}
Суть программы в том, что main вызывает случайным образом то sleep1, то sleep2 с равной вероятностью (что возникает из свойств генератора ПСЧ rand()).
Теперь распишем действия с prof_demo.c
- Скомпилируем программу, включив в исполняемый файл данные для профайлера:
- Выполним программу для получения файла gmon.out
- Сформируем отчёт профайлера и сохраним его в файле
- С помощью gprof2dot создадим файл с описанием схемы вызова функций
- Теперь остаётся получить графическое изображение при помощи dot
- Любуемся результатом:
gcc -pg -o prof_demo prof_demo.c
./prof_demo
gprof -b prof_demo > 1.dat
./gprof2dot.py 1.dat > 1.dot
dot -Tpng -o 1.png 1.dot

Комментариев нет:
Отправить комментарий