harfbuzz/perf
Behdad Esfahbod 0ff5d36cd4 [perf/benchmark-ot] Fix benchmark
Part of https://github.com/harfbuzz/harfbuzz/issues/3591

Ouch!

These are the current numbers:

------------------------------------------------------------------------------------------------
Benchmark                                                      Time             CPU   Iterations
------------------------------------------------------------------------------------------------
BM_hb_ot_tags_from_script_and_language/COMMON abcd_XY       78.0 ns         77.7 ns      8917912
BM_hb_ot_tags_from_script_and_language/COMMON zh_CN         44.9 ns         44.8 ns     15475318
BM_hb_ot_tags_from_script_and_language/COMMON en_US         17.6 ns         17.5 ns     39812340
BM_hb_ot_tags_from_script_and_language/LATIN en_US          18.2 ns         18.1 ns     38356204
BM_hb_ot_tags_from_script_and_language/COMMON none          4.76 ns         4.74 ns    148746131
BM_hb_ot_tags_from_script_and_language/LATIN none           4.73 ns         4.71 ns    148421349
2022-05-17 16:38:19 -06:00
..
fonts [perf] Make subset benchmark data driven. 2022-05-10 14:30:08 -06:00
texts Rename HBGlyphID to HBGlyphID16 2021-09-19 16:30:12 -04:00
Makefile.am [perf] Add benchmark-ot 2022-05-17 13:12:17 -06:00
README.md [perf] Add missing ninja command in profiling instructions. 2022-04-21 11:16:12 -06:00
benchmark-font.cc [perf/benchmark-font] Test Roboto as variable even though it's not 2022-05-16 17:49:36 -06:00
benchmark-map.cc [benchmark-map] Remove rand() overhead from benchmark 2022-04-29 13:14:41 -06:00
benchmark-ot.cc [perf/benchmark-ot] Fix benchmark 2022-05-17 16:38:19 -06:00
benchmark-set.cc [benchmark-set] Split SetLookup into an ordered and random version 2022-04-29 13:39:15 -06:00
benchmark-shape.cc [perf/benchmark-font] Parametrize test 2022-05-02 14:03:15 -06:00
benchmark-subset.cc [perf/benchmark-subset] Minor cleanup 2022-05-11 12:14:49 -06:00
meson.build [perf] Add benchmark-ot 2022-05-17 13:12:17 -06:00
run.sh [perf] More rename 2019-12-10 12:43:42 -06:00

README.md

Building and Running

Benchmarks are implemented using Google Benchmark.

To build the benchmarks in this directory you need to set the benchmark option while configuring the build with meson:

meson configure build -Dbenchmark=enabled --buildtype=release

Then build the benchmark binaries with ninja:

ninja -Cbuild perf/benchmark-set

Finally, to run one of the benchmarks:

./build/perf/benchmark-set

It's possible to filter the benchmarks being run and customize the output via flags to the benchmark binary. See the Google Benchmark User Guide for more details.

Profiling

Configure the build to include debug information for profiling:

CXXFLAGS="-fno-omit-frame-pointer" meson --reconfigure build -Dbenchmark=enabled --buildtype=debug
ninja -Cbuild

Then run the benchmark with perf:

perf record -g -o ~/tmp/profiles/subset.prof ./build/perf/benchmark-subset --benchmark_filter="BM_subset_codepoints/subset_notocjk/100000" --benchmark_repetitions=5

You probably want to filter to a specific benchmark of interest and set the number of repititions high enough to get a good sampling of profile data.

Finally view the profile with:

perf report -i ~/tmp/profiles/subset.prof