воскресенье, 27 октября 2013 г.

Об одной полезной задаче профилирования

В операционных системах Unix-семейства существует несколько полезных утилит, с помощью которых можно быстро осуществить профилирование программы на Си и построить граф, отражающий "стоимость" вызова функций.
Для работы нам понадобятся следующие инструменты:

  • пакет разработчика gcc;
  • профайлер gprof;
  • полезный скрипт на Python Gprof2Dot, преобразующий данные профайлера в описание на языке dot;
  • пакет визуализации графов graphviz, в частности, программа dot, формирующая изображение графа вызовов функций.
В качестве "испытуемой" напишем небольшую программу их трёх функций:

#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

  1. Скомпилируем программу, включив в исполняемый файл данные для профайлера:
  2. gcc -pg -o prof_demo prof_demo.c

  3. Выполним программу для получения файла gmon.out
  4. ./prof_demo

  5. Сформируем отчёт профайлера и сохраним его в файле
  6. gprof -b prof_demo > 1.dat

  7. С помощью gprof2dot создадим файл с описанием схемы вызова функций
  8. ./gprof2dot.py 1.dat > 1.dot

  9. Теперь остаётся получить графическое изображение при помощи dot
  10. dot -Tpng -o 1.png 1.dot

  11. Любуемся результатом:



По рисунку видно, что время выполнения программы практически поровну делится между работой sleep1 и sleep2. На домашней страничке проекта Gprof2Dot показана ещё более впечатляющая схема распределения runtime-ресурсов между разными функциями.





Комментариев нет:

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