1#include <stdio.h>
2#include <time.h>
3#include <roaring/portability.h>
4#include <roaring/containers/array.h>
5#include <roaring/containers/bitset.h>
6#include <roaring/containers/run.h>
7#include <roaring/containers/mixed_equal.h>
8#include "benchmark.h"
9#include "random.h"
10
11int32_t array_container_get_nruns(const array_container_t *c) { (void) c; return -1; }
12int32_t bitset_container_get_nruns(const bitset_container_t *c) { (void) c; return -1; }
13int32_t run_container_get_nruns(const run_container_t *c) { return c->n_runs; }
14
15#define BENCHMARK_CONTAINER(cname1, cname2, fname, n) \
16{ \
17 cname1##_container_t *c1 = cname1##_container_create(); \
18 cname2##_container_t *c2 = cname2##_container_create(); \
19 uint16_t* values = malloc(0x10000 * sizeof(uint16_t)); \
20 for (uint32_t i = 0; i < 0x10000; i++) { \
21 values[i] = i; \
22 } \
23 shuffle_uint16(values, 0x10000); \
24 for (uint32_t i = 0; i < n; i++) { \
25 cname1##_container_add(c1, values[i]); \
26 cname2##_container_add(c2, values[i]); \
27 } \
28 free(values); \
29 printf("[Size:%5u] ", n); \
30 printf("[NRuns:%5d] ", cname1##_container_get_nruns(c1)); \
31 printf("[NRuns:%5d] ", cname2##_container_get_nruns(c2)); \
32 BEST_TIME(fname(c1, c2), true, repeat, 1); \
33 cname1##_container_free(c1); \
34 cname2##_container_free(c2); \
35}
36
37int main(int argc, char* argv[]) {
38 (void)argc;
39 (void)argv;
40 const int repeat = 100*1000;
41
42 BENCHMARK_CONTAINER(array, array, array_container_equals, 64);
43 BENCHMARK_CONTAINER(array, array, array_container_equals, DEFAULT_MAX_SIZE);
44 BENCHMARK_CONTAINER(array, array, array_container_equals, 2*DEFAULT_MAX_SIZE);
45 BENCHMARK_CONTAINER(bitset, bitset, bitset_container_equals, 65535);
46 BENCHMARK_CONTAINER(bitset, bitset, bitset_container_equals, 65536);
47 BENCHMARK_CONTAINER(run, run, run_container_equals, DEFAULT_MAX_SIZE/2);
48 BENCHMARK_CONTAINER(run, run, run_container_equals, DEFAULT_MAX_SIZE);
49 BENCHMARK_CONTAINER(run, array, run_container_equals_array, DEFAULT_MAX_SIZE);
50 BENCHMARK_CONTAINER(array, bitset, array_container_equal_bitset, DEFAULT_MAX_SIZE);
51 BENCHMARK_CONTAINER(run, bitset, run_container_equals_bitset, DEFAULT_MAX_SIZE);
52
53 return 0;
54}
55
56