diff --git a/perf/benchmark-map.cc b/perf/benchmark-map.cc new file mode 100644 index 000000000..df116dcf7 --- /dev/null +++ b/perf/benchmark-map.cc @@ -0,0 +1,63 @@ +/* + * Benchmarks for hb_map_t operations. + */ +#include "benchmark/benchmark.h" + +#include +#include "hb.h" + +void RandomMap(unsigned size, hb_map_t* out) { + hb_map_clear(out); + + srand(size); + for (unsigned i = 0; i < size; i++) { + while (true) { + hb_codepoint_t next = rand(); + if (hb_map_has (out, next)) continue; + + hb_map_set (out, next, rand ()); + break; + } + } +} + +/* Insert a single value into map of varying sizes. */ +static void BM_MapInsert(benchmark::State& state) { + unsigned map_size = state.range(0); + + hb_map_t* original = hb_map_create (); + RandomMap(map_size, original); + assert(hb_map_get_population(original) == map_size); + + for (auto _ : state) { + // TODO(garretrieger): create a copy of the original map. + // Needs a hb_map_copy(..) in public api. + + hb_map_set (original, rand (), rand ()); + } + + hb_map_destroy(original); +} +BENCHMARK(BM_MapInsert) + ->Range(1 << 10, 1 << 16); + +/* Single value lookup on map of various sizes. */ +static void BM_MapLookup(benchmark::State& state) { + unsigned map_size = state.range(0); + + hb_map_t* original = hb_map_create (); + RandomMap(map_size, original); + assert(hb_map_get_population(original) == map_size); + + for (auto _ : state) { + benchmark::DoNotOptimize( + hb_map_get (original, rand())); + } + + hb_map_destroy(original); +} +BENCHMARK(BM_MapLookup) + ->Range(1 << 10, 1 << 16); // Set size + + +BENCHMARK_MAIN(); diff --git a/perf/benchmark-set.cc b/perf/benchmark-set.cc index 553d8285b..cb7d993c2 100644 --- a/perf/benchmark-set.cc +++ b/perf/benchmark-set.cc @@ -1,3 +1,6 @@ +/* + * Benchmarks for hb_set_t operations. + */ #include "benchmark/benchmark.h" #include @@ -18,6 +21,8 @@ void RandomSet(unsigned size, unsigned max_value, hb_set_t* out) { } } +// TODO(garretrieger): benchmark union/subtract/intersection etc. + /* Insert a single value into set of varying sizes. */ static void BM_SetInsert(benchmark::State& state) { unsigned set_size = state.range(0); diff --git a/perf/meson.build b/perf/meson.build index 92d872417..084b9021b 100644 --- a/perf/meson.build +++ b/perf/meson.build @@ -23,13 +23,19 @@ benchmark('perf', executable('perf', 'perf.cc', 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'), + google_benchmark_dep, ], - cpp_args: ttf_parser_dep.found() ? ['-DHAVE_TTFPARSER'] : [], + cpp_args: [], + include_directories: [incconfig, incsrc], + link_with: [libharfbuzz], + install: false, +), workdir: meson.current_source_dir() / '..', timeout: 100) + +benchmark('benchmark-map', executable('benchmark-map', 'benchmark-map.cc', + dependencies: [ + google_benchmark_dep, + ], + cpp_args: [], include_directories: [incconfig, incsrc], link_with: [libharfbuzz], install: false,