1*2d1272b8SAndroid Build Coastguard Worker #include "hb-benchmark.hh"
2*2d1272b8SAndroid Build Coastguard Worker
RandomSet(unsigned size,unsigned max_value,hb_set_t * out)3*2d1272b8SAndroid Build Coastguard Worker void RandomSet(unsigned size, unsigned max_value, hb_set_t* out) {
4*2d1272b8SAndroid Build Coastguard Worker hb_set_clear(out);
5*2d1272b8SAndroid Build Coastguard Worker
6*2d1272b8SAndroid Build Coastguard Worker srand(size * max_value);
7*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < size; i++) {
8*2d1272b8SAndroid Build Coastguard Worker while (true) {
9*2d1272b8SAndroid Build Coastguard Worker unsigned next = rand() % max_value;
10*2d1272b8SAndroid Build Coastguard Worker if (hb_set_has (out, next)) continue;
11*2d1272b8SAndroid Build Coastguard Worker
12*2d1272b8SAndroid Build Coastguard Worker hb_set_add(out, next);
13*2d1272b8SAndroid Build Coastguard Worker break;
14*2d1272b8SAndroid Build Coastguard Worker }
15*2d1272b8SAndroid Build Coastguard Worker }
16*2d1272b8SAndroid Build Coastguard Worker }
17*2d1272b8SAndroid Build Coastguard Worker
18*2d1272b8SAndroid Build Coastguard Worker // TODO(garretrieger): benchmark union/subtract/intersection etc.
19*2d1272b8SAndroid Build Coastguard Worker
20*2d1272b8SAndroid Build Coastguard Worker /* Insert a 1000 values into set of varying sizes. */
BM_SetInsert_1000(benchmark::State & state)21*2d1272b8SAndroid Build Coastguard Worker static void BM_SetInsert_1000(benchmark::State& state) {
22*2d1272b8SAndroid Build Coastguard Worker unsigned set_size = state.range(0);
23*2d1272b8SAndroid Build Coastguard Worker unsigned max_value = state.range(0) * state.range(1);
24*2d1272b8SAndroid Build Coastguard Worker
25*2d1272b8SAndroid Build Coastguard Worker hb_set_t* original = hb_set_create ();
26*2d1272b8SAndroid Build Coastguard Worker RandomSet(set_size, max_value, original);
27*2d1272b8SAndroid Build Coastguard Worker assert(hb_set_get_population(original) == set_size);
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker for (auto _ : state) {
30*2d1272b8SAndroid Build Coastguard Worker state.PauseTiming ();
31*2d1272b8SAndroid Build Coastguard Worker hb_set_t* data = hb_set_copy(original);
32*2d1272b8SAndroid Build Coastguard Worker state.ResumeTiming ();
33*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < 1000; i++) {
34*2d1272b8SAndroid Build Coastguard Worker hb_set_add(data, i * 2654435761u % max_value);
35*2d1272b8SAndroid Build Coastguard Worker }
36*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(data);
37*2d1272b8SAndroid Build Coastguard Worker }
38*2d1272b8SAndroid Build Coastguard Worker
39*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(original);
40*2d1272b8SAndroid Build Coastguard Worker }
41*2d1272b8SAndroid Build Coastguard Worker BENCHMARK(BM_SetInsert_1000)
42*2d1272b8SAndroid Build Coastguard Worker ->Unit(benchmark::kMicrosecond)
43*2d1272b8SAndroid Build Coastguard Worker ->Ranges(
44*2d1272b8SAndroid Build Coastguard Worker {{1 << 10, 1 << 16}, // Set Size
45*2d1272b8SAndroid Build Coastguard Worker {2, 512}}); // Density
46*2d1272b8SAndroid Build Coastguard Worker
47*2d1272b8SAndroid Build Coastguard Worker /* Insert a 1000 values into set of varying sizes. */
BM_SetOrderedInsert_1000(benchmark::State & state)48*2d1272b8SAndroid Build Coastguard Worker static void BM_SetOrderedInsert_1000(benchmark::State& state) {
49*2d1272b8SAndroid Build Coastguard Worker unsigned set_size = state.range(0);
50*2d1272b8SAndroid Build Coastguard Worker unsigned max_value = state.range(0) * state.range(1);
51*2d1272b8SAndroid Build Coastguard Worker
52*2d1272b8SAndroid Build Coastguard Worker hb_set_t* original = hb_set_create ();
53*2d1272b8SAndroid Build Coastguard Worker RandomSet(set_size, max_value, original);
54*2d1272b8SAndroid Build Coastguard Worker assert(hb_set_get_population(original) == set_size);
55*2d1272b8SAndroid Build Coastguard Worker
56*2d1272b8SAndroid Build Coastguard Worker for (auto _ : state) {
57*2d1272b8SAndroid Build Coastguard Worker state.PauseTiming ();
58*2d1272b8SAndroid Build Coastguard Worker hb_set_t* data = hb_set_copy(original);
59*2d1272b8SAndroid Build Coastguard Worker state.ResumeTiming ();
60*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < 1000; i++) {
61*2d1272b8SAndroid Build Coastguard Worker hb_set_add(data, i);
62*2d1272b8SAndroid Build Coastguard Worker }
63*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(data);
64*2d1272b8SAndroid Build Coastguard Worker }
65*2d1272b8SAndroid Build Coastguard Worker
66*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(original);
67*2d1272b8SAndroid Build Coastguard Worker }
68*2d1272b8SAndroid Build Coastguard Worker BENCHMARK(BM_SetOrderedInsert_1000)
69*2d1272b8SAndroid Build Coastguard Worker ->Unit(benchmark::kMicrosecond)
70*2d1272b8SAndroid Build Coastguard Worker ->Ranges(
71*2d1272b8SAndroid Build Coastguard Worker {{1 << 10, 1 << 16}, // Set Size
72*2d1272b8SAndroid Build Coastguard Worker {2, 512}}); // Density
73*2d1272b8SAndroid Build Coastguard Worker
74*2d1272b8SAndroid Build Coastguard Worker /* Single value lookup on sets of various sizes. */
BM_SetLookup(benchmark::State & state,unsigned interval)75*2d1272b8SAndroid Build Coastguard Worker static void BM_SetLookup(benchmark::State& state, unsigned interval) {
76*2d1272b8SAndroid Build Coastguard Worker unsigned set_size = state.range(0);
77*2d1272b8SAndroid Build Coastguard Worker unsigned max_value = state.range(0) * state.range(1);
78*2d1272b8SAndroid Build Coastguard Worker
79*2d1272b8SAndroid Build Coastguard Worker hb_set_t* original = hb_set_create ();
80*2d1272b8SAndroid Build Coastguard Worker RandomSet(set_size, max_value, original);
81*2d1272b8SAndroid Build Coastguard Worker assert(hb_set_get_population(original) == set_size);
82*2d1272b8SAndroid Build Coastguard Worker
83*2d1272b8SAndroid Build Coastguard Worker auto needle = max_value / 2;
84*2d1272b8SAndroid Build Coastguard Worker for (auto _ : state) {
85*2d1272b8SAndroid Build Coastguard Worker benchmark::DoNotOptimize(
86*2d1272b8SAndroid Build Coastguard Worker hb_set_has (original, (needle += interval) % max_value));
87*2d1272b8SAndroid Build Coastguard Worker }
88*2d1272b8SAndroid Build Coastguard Worker
89*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(original);
90*2d1272b8SAndroid Build Coastguard Worker }
91*2d1272b8SAndroid Build Coastguard Worker BENCHMARK_CAPTURE(BM_SetLookup, ordered, 3)
92*2d1272b8SAndroid Build Coastguard Worker ->Ranges(
93*2d1272b8SAndroid Build Coastguard Worker {{1 << 10, 1 << 16}, // Set Size
94*2d1272b8SAndroid Build Coastguard Worker {2, 512}}); // Density
95*2d1272b8SAndroid Build Coastguard Worker BENCHMARK_CAPTURE(BM_SetLookup, random, 12345)
96*2d1272b8SAndroid Build Coastguard Worker ->Ranges(
97*2d1272b8SAndroid Build Coastguard Worker {{1 << 10, 1 << 16}, // Set Size
98*2d1272b8SAndroid Build Coastguard Worker {2, 512}}); // Density
99*2d1272b8SAndroid Build Coastguard Worker
100*2d1272b8SAndroid Build Coastguard Worker /* Full iteration of sets of varying sizes. */
BM_SetIteration(benchmark::State & state)101*2d1272b8SAndroid Build Coastguard Worker static void BM_SetIteration(benchmark::State& state) {
102*2d1272b8SAndroid Build Coastguard Worker unsigned set_size = state.range(0);
103*2d1272b8SAndroid Build Coastguard Worker unsigned max_value = state.range(0) * state.range(1);
104*2d1272b8SAndroid Build Coastguard Worker
105*2d1272b8SAndroid Build Coastguard Worker hb_set_t* original = hb_set_create ();
106*2d1272b8SAndroid Build Coastguard Worker RandomSet(set_size, max_value, original);
107*2d1272b8SAndroid Build Coastguard Worker assert(hb_set_get_population(original) == set_size);
108*2d1272b8SAndroid Build Coastguard Worker
109*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t cp = HB_SET_VALUE_INVALID;
110*2d1272b8SAndroid Build Coastguard Worker for (auto _ : state) {
111*2d1272b8SAndroid Build Coastguard Worker hb_set_next (original, &cp);
112*2d1272b8SAndroid Build Coastguard Worker }
113*2d1272b8SAndroid Build Coastguard Worker
114*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(original);
115*2d1272b8SAndroid Build Coastguard Worker }
116*2d1272b8SAndroid Build Coastguard Worker BENCHMARK(BM_SetIteration)
117*2d1272b8SAndroid Build Coastguard Worker ->Ranges(
118*2d1272b8SAndroid Build Coastguard Worker {{1 << 10, 1 << 16}, // Set Size
119*2d1272b8SAndroid Build Coastguard Worker {2, 512}}); // Density
120*2d1272b8SAndroid Build Coastguard Worker
121*2d1272b8SAndroid Build Coastguard Worker /* Set copy. */
BM_SetCopy(benchmark::State & state)122*2d1272b8SAndroid Build Coastguard Worker static void BM_SetCopy(benchmark::State& state) {
123*2d1272b8SAndroid Build Coastguard Worker unsigned set_size = state.range(0);
124*2d1272b8SAndroid Build Coastguard Worker unsigned max_value = state.range(0) * state.range(1);
125*2d1272b8SAndroid Build Coastguard Worker
126*2d1272b8SAndroid Build Coastguard Worker hb_set_t* original = hb_set_create ();
127*2d1272b8SAndroid Build Coastguard Worker RandomSet(set_size, max_value, original);
128*2d1272b8SAndroid Build Coastguard Worker assert(hb_set_get_population(original) == set_size);
129*2d1272b8SAndroid Build Coastguard Worker
130*2d1272b8SAndroid Build Coastguard Worker for (auto _ : state) {
131*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
132*2d1272b8SAndroid Build Coastguard Worker hb_set_set (s, original);
133*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
134*2d1272b8SAndroid Build Coastguard Worker }
135*2d1272b8SAndroid Build Coastguard Worker
136*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(original);
137*2d1272b8SAndroid Build Coastguard Worker }
138*2d1272b8SAndroid Build Coastguard Worker BENCHMARK(BM_SetCopy)
139*2d1272b8SAndroid Build Coastguard Worker ->Unit(benchmark::kMicrosecond)
140*2d1272b8SAndroid Build Coastguard Worker ->Ranges(
141*2d1272b8SAndroid Build Coastguard Worker {{1 << 10, 1 << 16}, // Set Size
142*2d1272b8SAndroid Build Coastguard Worker {2, 512}}); // Density
143*2d1272b8SAndroid Build Coastguard Worker
144*2d1272b8SAndroid Build Coastguard Worker BENCHMARK_MAIN();
145