diff --git a/perf/benchmark-set.cc b/perf/benchmark-set.cc new file mode 100644 index 000000000..8763945c3 --- /dev/null +++ b/perf/benchmark-set.cc @@ -0,0 +1,49 @@ +#include "benchmark/benchmark.h" + +#include +#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; + } + } +} + +static void BM_SetInsert(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(); + + hb_set_add(data, rand() % max_value); + + state.PauseTiming(); + hb_set_destroy(data); + state.ResumeTiming(); + } + + hb_set_destroy(original); +} +BENCHMARK(BM_SetInsert) + ->ArgsProduct({ + benchmark::CreateRange(1 << 10, 1 << 16, 8), // Set size + benchmark::CreateDenseRange(2, 8, /*step=*/2) // Density + }); + +BENCHMARK_MAIN(); diff --git a/perf/meson.build b/perf/meson.build index e12744c4d..92d872417 100644 --- a/perf/meson.build +++ b/perf/meson.build @@ -19,3 +19,18 @@ benchmark('perf', executable('perf', 'perf.cc', link_with: [libharfbuzz], install: false, ), workdir: meson.current_source_dir() / '..', timeout: 100) + + +benchmark('benchmark-set', executable('benchmark-set', 'benchmark-set.cc', + dependencies: [ + google_benchmark_dep, freetype_dep, + + # the last two, thread and dl, aren't nice as ttf-parser isn't no_std yet + # https://github.com/RazrFalcon/ttf-parser/issues/29 + ttf_parser_dep, thread_dep, cpp.find_library('dl'), + ], + cpp_args: ttf_parser_dep.found() ? ['-DHAVE_TTFPARSER'] : [], + include_directories: [incconfig, incsrc], + link_with: [libharfbuzz], + install: false, +), workdir: meson.current_source_dir() / '..', timeout: 100)