#!/usr/bin/env bash set -e PROGNAME="$(basename "${0}")" MONOREPO_ROOT="$(realpath $(dirname "${PROGNAME}"))" function usage() { cat < benchmarks... [-- gbench-args...] Compare the given benchmarks between the baseline and the candidate build directories. This requires those benchmarks to have already been generated in both build directories. The path to the build directory considered the baseline. The path to the build directory considered the candidate. benchmarks... Paths of the benchmarks to compare. Those paths are relative to ''. [-- gbench-args...] Any arguments provided after '--' will be passed as-is to GoogleBenchmark's compare.py tool. Example ======= $ libcxx-lit build1/ -sv libcxx/test/benchmarks/algorithms/for_each.bench.cpp $ libcxx-lit build2/ -sv libcxx/test/benchmarks/algorithms/for_each.bench.cpp $ ${PROGNAME} build1/ build2/ libcxx/test/benchmarks/algorithms/for_each.bench.cpp EOF } if [[ "${1}" == "-h" || "${1}" == "--help" ]]; then usage exit 0 fi if [[ $# -lt 1 ]]; then usage exit 1 fi baseline="${1}" candidate="${2}" shift; shift GBENCH="${MONOREPO_ROOT}/third-party/benchmark" python3 -m venv /tmp/libcxx-compare-benchmarks-venv source /tmp/libcxx-compare-benchmarks-venv/bin/activate pip3 install -r ${GBENCH}/tools/requirements.txt benchmarks="" while [[ $# -gt 0 ]]; do if [[ "${1}" == "--" ]]; then shift break fi benchmarks+=" ${1}" shift done for benchmark in ${benchmarks}; do base="$(${MONOREPO_ROOT}/libcxx/utils/libcxx-benchmark-json ${baseline} ${benchmark})" cand="$(${MONOREPO_ROOT}/libcxx/utils/libcxx-benchmark-json ${candidate} ${benchmark})" if [[ ! -e "${base}" ]]; then echo "Benchmark ${benchmark} does not exist in the baseline" continue fi if [[ ! -e "${cand}" ]]; then echo "Benchmark ${benchmark} does not exist in the candidate" continue fi "${GBENCH}/tools/compare.py" benchmarks "${base}" "${cand}" ${@} done