Распечатка 8.9 Использование eProf

Предыдущая  Содержание  Следующая V*D*V

Распечатка 8.9.

 

/* prof.c */

 

#include <pthread.h>

 

/*

 * Заголовочный файл eProf. Исходный код разных интерфейсов eProf

 * находится в eprof.c

 */

#include "eprof.h"

#define MAX_LOOP 10 // счётчик циклов

 

/*

 * Эта функция работает в контексте разных потоков. Здесь мы

 * профилируем время, затраченное на выполнение основного цикла

 * функции

 */

void func_1(void * dummy){

  int i;

  /*

   * Создаём экземпляр профилировщика. Назначаем ему имя –

   * ‘func1’

   */

  int id = eprof_alloc("func1");

 

  /*

   * Запускаем профилировщик. Аргументом является идентификатор

   * экземпляра, возвращаемый eprof_alloc

   */

  eprof_start(id);

 

  /* Мы профилируем этот цикл */

  for (i = 0; i < MAX_LOOP; i++){

    usleep(1000*1000);

  }

 

  /*

   * Останавливаем профилировщик. Мы печатаем результаты

   * профилирования в конце программы

   */

  eprof_stop(id);

}

 

/*

 * В этот примере мы профилируем каждую итерацию цикла.

 * Эта функция вызывается в main.

 */

void func_2(void){

  int i;

  /* Создаём экземпляр профилировщика */

  int id = eprof_alloc("func2");

 

  /*

   * Как видите, мы вызываем пару eprof_start и eprof_stop

   * много раз. Профилировщик записывает общее число раз

   * вызова этой пары, а затем показывает результаты,

   * усредняя их

   */

  for (i = 0 ; i < MAX_LOOP; i++){

    /* Запускаем профилировщик */

    eprof_start(id);

    usleep(500*1000);

    /* Останавливаем профилировщик */

    eprof_stop(id);

  }

}

 

/*

 * Основное приложение. Оно создаёт поток, запускающий функцию

 * func_1. Затем оно вызывает func_2 и ждёт завершения потока.

 * В конце оно печатает результаты профилирования.

 */

int main(){

  pthread_t thread_id;

 

  /*

   * Инициализируем eProf. Это должно быть сделано во время

   * запуска программы.

   */

  eprof_init();

  /* Создаём поток, который запускает функцию func_1 */

  pthread_create(&thread_id, NULL, func_1, NULL);

  /* Запускаем функцию func_2 */

  func_2();

  /* Ждём завершения потока */

  pthread_join(thread_id, NULL);

  /* Печатаем результаты */

  eprof_print();

  return 0;

}

 

Предыдущая  Содержание  Следующая