aboutsummaryrefslogtreecommitdiffstats
path: root/bench/benchmark-zrand.c
blob: a7e9fb45b73dd5c0145e1a5eb5cabf96d12c229e (plain) (blame)
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
#include <time.h>
#include <stdio.h>

#include "../zahl.h"


#ifndef CLOCK_MONOTONIC_RAW
# define CLOCK_MONOTONIC_RAW  CLOCK_MONOTONIC
#endif


#define BENCHMARK(INSTRUCTION, FAST)\
	do {\
		i = FAST ? 1000000L : 1000L;\
		clock_gettime(CLOCK_MONOTONIC_RAW, &start);\
		while (i--) {\
			INSTRUCTION;\
		}\
		clock_gettime(CLOCK_MONOTONIC_RAW, &end);\
		end.tv_sec -= start.tv_sec;\
		end.tv_nsec -= start.tv_nsec;\
		if (end.tv_nsec < 0) {\
			end.tv_nsec += 1000000000L;\
			end.tv_sec -= 1;\
		}\
		printf("%s: %lli.%09li %s\n",\
		       #INSTRUCTION,\
		       (long long int)(end.tv_sec), end.tv_nsec,\
		       FAST ? "µs" : "ms");\
	} while (0)


int
main(int argc, char *argv[])
{
	struct timespec start, end;
	z_t r, n;
	jmp_buf jmp;
	size_t i;

	if (setjmp(jmp)) {
		zperror(argv[0]);
		return 1;
	}
	zsetup(jmp);
	zinit(r);
	zinit(n);

	zsetu(n, 1);
	zlsh(n, n, 64000L - 1L);
	zset(r, n);

	BENCHMARK(zrand(r, FAST_RANDOM, MODUNIFORM, n), 0);
	BENCHMARK(zrand(r, LIBC_RAND_RANDOM, MODUNIFORM, n), 0);
	BENCHMARK(zrand(r, LIBC_RANDOM_RANDOM, MODUNIFORM, n), 0);
	BENCHMARK(zrand(r, LIBC_RAND48_RANDOM, MODUNIFORM, n), 0);

	zfree(r);
	zfree(n);
	zunsetup();
	return 0;
	(void) argc;
}