Распечатка 8.9 Использование eProf |
Предыдущая Содержание Следующая |
Распечатка 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; }
|
Предыдущая Содержание Следующая |