summaryrefslogtreecommitdiff
path: root/benchmarks/main.c
blob: df8298fddab72cb567843f19af6ec96332ea6b7f (plain)
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

#include <stdbool.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

/* Cycle between a bunch of different messages, to avoid performance
 * variations due to memory effects of a particular allocation pattern. */
#ifndef NUM_MESSAGES
#define NUM_MESSAGES 32
#endif

static bool initialize();
static void cleanup();
static size_t run(int i);

int main (int argc, char *argv[])
{
  (void)argc;

  /* Change cwd to where the binary is. */
  char *lastslash = strrchr(argv[0], '/');
  char *progname = argv[0];
  if(lastslash) {
    *lastslash = '\0';
    chdir(argv[0]);
    *lastslash = '/';
    progname = lastslash + 3;  /* "/b_" */
  }

  if(!initialize()) {
    fprintf(stderr, "%s: failed to initialize\n", argv[0]);
    return 1;
  }

  size_t total_bytes = 0;
  clock_t before = clock();
  for(int i = 0; true; i++) {
    if((i & 0xFF) == 0 && (clock() - before > CLOCKS_PER_SEC)) break;
    size_t bytes = run(i);
    if(bytes == 0) {
      fprintf(stderr, "%s: failed.\n", argv[0]);
      return 2;
    }
    total_bytes += bytes;
  }
  double elapsed = ((double)clock() - before) / CLOCKS_PER_SEC;
  printf("%s:%d\n", progname, (int)(total_bytes / elapsed / (1 << 20)));
  cleanup();
  return 0;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback