1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*
Copyright (C) 2022 The University of Notre Dame
This software is distributed under the GNU General Public License.
See the file COPYING for details.
*/
#include "timer.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
int NumberOfTimers = 0;
const char **TimerStrings = NULL;
struct timeval *StartTime = NULL;
struct timeval *EndTime = NULL;
double *ElapsedTime = NULL;
int *TimedRuns = NULL;
void timer_init(int timers, const char *timer_strings[])
{
StartTime = malloc(sizeof(struct timeval) * timers);
EndTime = malloc(sizeof(struct timeval) * timers);
ElapsedTime = malloc(sizeof(double) * timers);
TimedRuns = malloc(sizeof(int) * timers);
memset(ElapsedTime, 0, sizeof(double) * timers);
memset(TimedRuns, 0, sizeof(int) * timers);
NumberOfTimers = timers;
TimerStrings = timer_strings;
}
#define FREE_AND_NULL(s) \
if (s) { \
free(s); \
(s) = NULL; \
}
void timer_destroy()
{
FREE_AND_NULL(StartTime);
FREE_AND_NULL(EndTime);
FREE_AND_NULL(ElapsedTime);
FREE_AND_NULL(TimedRuns);
}
void timer_start(int i)
{
gettimeofday(&StartTime[i], NULL);
}
void timer_stop(int i)
{
gettimeofday(&EndTime[i], NULL);
ElapsedTime[i] += (double)(EndTime[i].tv_sec - StartTime[i].tv_sec) + (double)(EndTime[i].tv_usec - StartTime[i].tv_usec) / 1000000.0;
TimedRuns[i]++;
}
void timer_reset(int i)
{
ElapsedTime[i] = 0.0;
TimedRuns[i] = 0;
}
double timer_elapsed_time(int i)
{
return (ElapsedTime[i]);
}
double timer_average_time(int i)
{
return (ElapsedTime[i] / TimedRuns[i]);
}
void timer_print_summary(int print_all)
{
int i;
for (i = 0; i < NumberOfTimers; i++)
if (TimedRuns[i] > 0 || print_all)
printf("%s = average(%2.6lf), total(%2.6lf), runs(%d)\n", TimerStrings[i], timer_average_time(i), ElapsedTime[i], TimedRuns[i]);
}
/* vim: set noexpandtab tabstop=8: */
|