aboutsummaryrefslogtreecommitdiff
path: root/perf/benchmark-set.cc
diff options
context:
space:
mode:
Diffstat (limited to 'perf/benchmark-set.cc')
-rw-r--r--perf/benchmark-set.cc151
1 files changed, 151 insertions, 0 deletions
diff --git a/perf/benchmark-set.cc b/perf/benchmark-set.cc
new file mode 100644
index 000000000..c170acfc0
--- /dev/null
+++ b/perf/benchmark-set.cc
@@ -0,0 +1,151 @@
+/*
+ * Benchmarks for hb_set_t operations.
+ */
+#include "benchmark/benchmark.h"
+
+#include <cassert>
+#include <cstdlib>
+#include "hb.h"
+
+void RandomSet(unsigned size, unsigned max_value, hb_set_t* out) {
+ hb_set_clear(out);
+
+ srand(size * max_value);
+ for (unsigned i = 0; i < size; i++) {
+ while (true) {
+ unsigned next = rand() % max_value;
+ if (hb_set_has (out, next)) continue;
+
+ hb_set_add(out, next);
+ break;
+ }
+ }
+}
+
+// TODO(garretrieger): benchmark union/subtract/intersection etc.
+
+/* Insert a 1000 values into set of varying sizes. */
+static void BM_SetInsert_1000(benchmark::State& state) {
+ unsigned set_size = state.range(0);
+ unsigned max_value = state.range(0) * state.range(1);
+
+ hb_set_t* original = hb_set_create ();
+ RandomSet(set_size, max_value, original);
+ assert(hb_set_get_population(original) == set_size);
+
+ for (auto _ : state) {
+ state.PauseTiming ();
+ hb_set_t* data = hb_set_copy(original);
+ state.ResumeTiming ();
+ for (int i = 0; i < 1000; i++) {
+ hb_set_add(data, i * 2654435761u % max_value);
+ }
+ hb_set_destroy(data);
+ }
+
+ hb_set_destroy(original);
+}
+BENCHMARK(BM_SetInsert_1000)
+ ->Unit(benchmark::kMicrosecond)
+ ->Ranges(
+ {{1 << 10, 1 << 16}, // Set Size
+ {2, 512}}); // Density
+
+/* Insert a 1000 values into set of varying sizes. */
+static void BM_SetOrderedInsert_1000(benchmark::State& state) {
+ unsigned set_size = state.range(0);
+ unsigned max_value = state.range(0) * state.range(1);
+
+ hb_set_t* original = hb_set_create ();
+ RandomSet(set_size, max_value, original);
+ assert(hb_set_get_population(original) == set_size);
+
+ for (auto _ : state) {
+ state.PauseTiming ();
+ hb_set_t* data = hb_set_copy(original);
+ state.ResumeTiming ();
+ for (int i = 0; i < 1000; i++) {
+ hb_set_add(data, i);
+ }
+ hb_set_destroy(data);
+ }
+
+ hb_set_destroy(original);
+}
+BENCHMARK(BM_SetOrderedInsert_1000)
+ ->Unit(benchmark::kMicrosecond)
+ ->Ranges(
+ {{1 << 10, 1 << 16}, // Set Size
+ {2, 512}}); // Density
+
+/* Single value lookup on sets of various sizes. */
+static void BM_SetLookup(benchmark::State& state, unsigned interval) {
+ unsigned set_size = state.range(0);
+ unsigned max_value = state.range(0) * state.range(1);
+
+ hb_set_t* original = hb_set_create ();
+ RandomSet(set_size, max_value, original);
+ assert(hb_set_get_population(original) == set_size);
+
+ auto needle = max_value / 2;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(
+ hb_set_has (original, (needle += interval) % max_value));
+ }
+
+ hb_set_destroy(original);
+}
+BENCHMARK_CAPTURE(BM_SetLookup, ordered, 3)
+ ->Ranges(
+ {{1 << 10, 1 << 16}, // Set Size
+ {2, 512}}); // Density
+BENCHMARK_CAPTURE(BM_SetLookup, random, 12345)
+ ->Ranges(
+ {{1 << 10, 1 << 16}, // Set Size
+ {2, 512}}); // Density
+
+/* Full iteration of sets of varying sizes. */
+static void BM_SetIteration(benchmark::State& state) {
+ unsigned set_size = state.range(0);
+ unsigned max_value = state.range(0) * state.range(1);
+
+ hb_set_t* original = hb_set_create ();
+ RandomSet(set_size, max_value, original);
+ assert(hb_set_get_population(original) == set_size);
+
+ hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+ for (auto _ : state) {
+ hb_set_next (original, &cp);
+ }
+
+ hb_set_destroy(original);
+}
+BENCHMARK(BM_SetIteration)
+ ->Ranges(
+ {{1 << 10, 1 << 16}, // Set Size
+ {2, 512}}); // Density
+
+/* Set copy. */
+static void BM_SetCopy(benchmark::State& state) {
+ unsigned set_size = state.range(0);
+ unsigned max_value = state.range(0) * state.range(1);
+
+ hb_set_t* original = hb_set_create ();
+ RandomSet(set_size, max_value, original);
+ assert(hb_set_get_population(original) == set_size);
+
+ for (auto _ : state) {
+ hb_set_t *s = hb_set_create ();
+ hb_set_set (s, original);
+ hb_set_destroy (s);
+ }
+
+ hb_set_destroy(original);
+}
+BENCHMARK(BM_SetCopy)
+ ->Unit(benchmark::kMicrosecond)
+ ->Ranges(
+ {{1 << 10, 1 << 16}, // Set Size
+ {2, 512}}); // Density
+
+BENCHMARK_MAIN();