Benchmark
 All Classes Files Functions Variables Typedefs Macros
Classes | Macros | Functions | Variables
benchmark.c File Reference

fonctions utiles pour écrire les .csv et mesurer le temps More...

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/times.h>
#include <time.h>
#include <unistd.h>
#include "benchmark.h"

Classes

struct  timer
 timer permet de mesurer le temps écoulé entre deux moments More...
 
struct  recorder
 recorder écrit les temps dans un fichier .csv More...
 

Macros

#define BILLION   1000000000
 
#define GETTIME_TO_NSEC(time_gettime)   (((long) time_gettime.tv_sec) * BILLION + time_gettime.tv_nsec)
 
#define CLOCK_TO_NSEC(time_clock)   ((((long) time_clock) * BILLION) / CLOCKS_PER_SEC)
 
#define TIMES_TO_NSEC(time_times)   ((((long) time_times.tms_utime + time_times.tms_stime) * BILLION) / t->clock_ticks)
 
#define GTOD_TO_NSEC(time_gtod)   (((long) time_gtod.tv_sec) * BILLION + time_gtod.tv_usec * 1000)
 

Functions

timertimer_alloc ()
 Alloue un timer More...
 
void start_timer (timer *t)
 Stoque le temps actuel comme début de la mesure dans t More...
 
long int stop_timer (timer *t)
 Retourne le temps en nanosecondes depuis le début de mesure dans t More...
 
void timer_free (timer *t)
 Retourne le temps en nanosecondes depuis le début de mesure dans t More...
 
void update_overhead ()
 Mets à jours l'overhead More...
 
long int get_overhead ()
 
recorderrecorder_alloc (char *filename)
 Alloue un recorder More...
 
void write_record (recorder *rec, long int x, long int time)
 Écris le temps time en correspondance avec x More...
 
void write_record_n (recorder *rec, long int x, long int time, long n)
 Comme write_record mais divise time par n après avoir retiré l'overhead More...
 
void recorder_free (recorder *rec)
 Libère toutes les resources utilisées par rec More...
 

Variables

volatile long int overhead = -1
 Temps nécessaire pour effectuer start_timer et stop_timer sans rien faire entre. More...
 

Detailed Description

fonctions utiles pour écrire les .csv et mesurer le temps

Cette libraire contient timer pour mesurer le temps et recorder pour écrire les temps dans un fichier au format .csv qu'on peut plotter facilement avec gnuplot.

Macro Definition Documentation

#define BILLION   1000000000
#define CLOCK_TO_NSEC (   time_clock)    ((((long) time_clock) * BILLION) / CLOCKS_PER_SEC)
#define GETTIME_TO_NSEC (   time_gettime)    (((long) time_gettime.tv_sec) * BILLION + time_gettime.tv_nsec)
#define GTOD_TO_NSEC (   time_gtod)    (((long) time_gtod.tv_sec) * BILLION + time_gtod.tv_usec * 1000)
#define TIMES_TO_NSEC (   time_times)    ((((long) time_times.tms_utime + time_times.tms_stime) * BILLION) / t->clock_ticks)

Function Documentation

long int get_overhead ( )
198  {
199  if (-1 == overhead) {
200  update_overhead();
201  }
202  return overhead;
203 }
void update_overhead()
Mets à jours l'overhead
Definition: benchmark.c:191
volatile long int overhead
Temps nécessaire pour effectuer start_timer et stop_timer sans rien faire entre.
Definition: benchmark.c:187
recorder* recorder_alloc ( char *  filename)

Alloue un recorder

Les données seront écrites dans le fichier filename. En cas d'erreur, il exit avec EXIT_FAILURE.

219  {
220  recorder *rec = (recorder *) malloc(sizeof(recorder));
221  if (rec == NULL) {
222  perror("malloc");
223  exit(EXIT_FAILURE);
224  }
225  rec->output = fopen(filename, "w");
226  if (rec->output == NULL) {
227  perror("fopen");
228  free(rec);
229  exit(EXIT_FAILURE);
230  }
231  rec->overhead = get_overhead();
232  return rec;
233 }
recorder écrit les temps dans un fichier .csv
Definition: benchmark.c:208
long int get_overhead()
Definition: benchmark.c:198
long int overhead
Definition: benchmark.c:210
FILE * output
Definition: benchmark.c:209
void recorder_free ( recorder rec)

Libère toutes les resources utilisées par rec

Parameters
recle recorder auquel il faut libérer les resources
263  {
264  fclose(rec->output);
265  free(rec);
266 }
FILE * output
Definition: benchmark.c:209
void start_timer ( timer t)

Stoque le temps actuel comme début de la mesure dans t

Parameters
tLe temps dans lequel on stoque le temps de début

En cas d'erreur, affiche un message sur stderr et exit

87  {
88 #if defined(BM_USE_CLOCK_GETTIME)
89  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t->start)) {
90  perror("clock_gettime");
91  exit(EXIT_FAILURE);
92  }
93 #elif defined(BM_USE_CLOCK_GETTIME_RT)
94  if (clock_gettime(CLOCK_REALTIME, &t->start)) {
95  perror("clock_gettime");
96  exit(EXIT_FAILURE);
97  }
98 #elif defined(BM_USE_CLOCK)
99  t->start = clock();
100  if (t->start == (clock_t) -1) {
101  perror("clock");
102  exit(EXIT_FAILURE);
103  }
104 #elif defined(BM_USE_TIMES)
105  if (times(&t->start) == -1) {
106  perror("times");
107  exit(EXIT_FAILURE);
108  }
109 #else
110  gettimeofday(&t->start, NULL);
111 #endif
112 }
struct timeval start
Definition: benchmark.c:52
long int stop_timer ( timer t)

Retourne le temps en nanosecondes depuis le début de mesure dans t

Parameters
tLe temps dans lequel on a stoqué le temps de début

En cas d'erreur, affiche un message sur stderr et exit

133  {
134  // time_t is only a 32 bits int on 32 bits machines
135 #if defined(BM_USE_CLOCK_GETTIME) || defined(BM_USE_CLOCK_GETTIME_RT)
136  struct timespec end;
137  //if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end)) {
138  if (clock_gettime(CLOCK_REALTIME, &end)) {
139  perror("clock_gettime");
140  exit(EXIT_FAILURE);
141  }
142  long total = GETTIME_TO_NSEC(end) - GETTIME_TO_NSEC(t->start);
143 #elif defined(BM_USE_CLOCK)
144  clock_t end = clock();
145  if (end == (clock_t) -1) {
146  perror("clock");
147  exit(EXIT_FAILURE);
148  }
149  long total = CLOCK_TO_NSEC(end) - CLOCK_TO_NSEC(t->start);
150 #elif defined(BM_USE_TIMES)
151  struct tms end;
152  if (times(&end) == -1) {
153  perror("times");
154  exit(EXIT_FAILURE);
155  }
156  long total = TIMES_TO_NSEC(end) - TIMES_TO_NSEC(t->start);;
157 #else
158  struct timeval end;
159  gettimeofday(&end, NULL);
160  long total = GTOD_TO_NSEC(end) - GTOD_TO_NSEC(t->start);
161 #endif
162  return total;
163 }
#define GTOD_TO_NSEC(time_gtod)
Definition: benchmark.c:123
#define CLOCK_TO_NSEC(time_clock)
Definition: benchmark.c:119
#define GETTIME_TO_NSEC(time_gettime)
Definition: benchmark.c:117
#define TIMES_TO_NSEC(time_times)
Definition: benchmark.c:121
struct timeval start
Definition: benchmark.c:52
timer* timer_alloc ( )

Alloue un timer

En cas de succès, retourne un timer, en cas d'erreur, affiche un message sur stderr et exit

63  {
64  timer *t = (timer *) malloc(sizeof(timer));
65  if (t == NULL) {
66  perror("malloc");
67  exit(EXIT_FAILURE);
68  }
69 #if defined(BM_USE_TIMES)
70  t->clock_ticks = sysconf(_SC_CLK_TCK);
71  if (t->clock_ticks == -1) {
72  free(t);
73  perror("sysconf");
74  exit(EXIT_FAILURE);
75  }
76 #endif
77  return t;
78 }
timer permet de mesurer le temps écoulé entre deux moments
Definition: benchmark.c:43
timer * t
Definition: memfork.c:25
void timer_free ( timer t)

Retourne le temps en nanosecondes depuis le début de mesure dans t

Parameters
tLe temps dans lequel on a stoqué le temps de début

En cas d'erreur, affiche un message sur stderr et exit

172  {
173  free(t);
174 }
void update_overhead ( )

Mets à jours l'overhead

191  {
192  timer *t = timer_alloc();
193  start_timer(t);
194  overhead = stop_timer(t);
195  timer_free(t);
196  printf("overhead updated: %ld\n", overhead);
197 }
void timer_free(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:172
timer permet de mesurer le temps écoulé entre deux moments
Definition: benchmark.c:43
timer * t
Definition: memfork.c:25
void start_timer(timer *t)
Stoque le temps actuel comme début de la mesure dans t
Definition: benchmark.c:87
volatile long int overhead
Temps nécessaire pour effectuer start_timer et stop_timer sans rien faire entre.
Definition: benchmark.c:187
timer * timer_alloc()
Alloue un timer
Definition: benchmark.c:63
long int stop_timer(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:133
void write_record ( recorder rec,
long int  x,
long int  time 
)

Écris le temps time en correspondance avec x

L'overhead est d'abord retiré de time En cas d'erreur, il exit avec EXIT_FAILURE

Parameters
recle recorder dans lequel écrire, il est supposé non-NULL
xl'abscisse
timele temps à écrire en ordonnée
245  {
246  write_record_n(rec, x, time, 1);
247 }
void write_record_n(recorder *rec, long int x, long int time, long n)
Comme write_record mais divise time par n après avoir retiré l'overhead
Definition: benchmark.c:253
void write_record_n ( recorder rec,
long int  x,
long int  time,
long  n 
)

Comme write_record mais divise time par n après avoir retiré l'overhead

253  {
254  fprintf(rec->output, "%ld, %ld\n", x, (time - rec->overhead) / n);
255 }
long int overhead
Definition: benchmark.c:210
FILE * output
Definition: benchmark.c:209

Variable Documentation

volatile long int overhead = -1

Temps nécessaire pour effectuer start_timer et stop_timer sans rien faire entre.