diff --git a/libcxx/benchmarks/VariantBenchmarks.h b/libcxx/benchmarks/VariantBenchmarks.h new file mode 100644 --- /dev/null +++ b/libcxx/benchmarks/VariantBenchmarks.h @@ -0,0 +1,58 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef BENCHMARK_VARIANT_BENCHMARKS_H +#define BENCHMARK_VARIANT_BENCHMARKS_H + +#include +#include +#include +#include +#include + +#include "benchmark/benchmark.h" + +#include "GenerateInput.h" + +namespace VariantBenchmarks { + +template +struct S { + static constexpr size_t v = I; +}; + +template +static auto genVariants(std::index_sequence) { + using V = std::variant...>; + using F = V (*)(); + static constexpr F fs[] = {[] { return V(std::in_place_index); }...}; + + std::array result = {}; + for (auto& v : result) { + v = fs[getRandomInteger(0ul, sizeof...(Is) - 1)](); + } + + return result; +} + +template +static void BM_Visit(benchmark::State& state) { + auto args = genVariants(std::make_index_sequence{}); + for (auto _ : state) { + benchmark::DoNotOptimize(std::apply( + [](auto... vs) { + return std::visit([](auto... is) { return (is.v + ... + 0); }, vs...); + }, + args)); + } +} + +} // end namespace VariantBenchmarks + +#endif // BENCHMARK_VARIANT_BENCHMARKS_H diff --git a/libcxx/benchmarks/variant_visit_1.bench.cpp b/libcxx/benchmarks/variant_visit_1.bench.cpp new file mode 100644 --- /dev/null +++ b/libcxx/benchmarks/variant_visit_1.bench.cpp @@ -0,0 +1,27 @@ +#include "benchmark/benchmark.h" + +#include "VariantBenchmarks.h" + +using namespace VariantBenchmarks; + +BENCHMARK_TEMPLATE(BM_Visit, 1, 1); +BENCHMARK_TEMPLATE(BM_Visit, 1, 2); +BENCHMARK_TEMPLATE(BM_Visit, 1, 3); +BENCHMARK_TEMPLATE(BM_Visit, 1, 4); +BENCHMARK_TEMPLATE(BM_Visit, 1, 5); +BENCHMARK_TEMPLATE(BM_Visit, 1, 6); +BENCHMARK_TEMPLATE(BM_Visit, 1, 7); +BENCHMARK_TEMPLATE(BM_Visit, 1, 8); +BENCHMARK_TEMPLATE(BM_Visit, 1, 9); +BENCHMARK_TEMPLATE(BM_Visit, 1, 10); +BENCHMARK_TEMPLATE(BM_Visit, 1, 20); +BENCHMARK_TEMPLATE(BM_Visit, 1, 30); +BENCHMARK_TEMPLATE(BM_Visit, 1, 40); +BENCHMARK_TEMPLATE(BM_Visit, 1, 50); +BENCHMARK_TEMPLATE(BM_Visit, 1, 60); +BENCHMARK_TEMPLATE(BM_Visit, 1, 70); +BENCHMARK_TEMPLATE(BM_Visit, 1, 80); +BENCHMARK_TEMPLATE(BM_Visit, 1, 90); +BENCHMARK_TEMPLATE(BM_Visit, 1, 100); + +BENCHMARK_MAIN(); diff --git a/libcxx/benchmarks/variant_visit_2.bench.cpp b/libcxx/benchmarks/variant_visit_2.bench.cpp new file mode 100644 --- /dev/null +++ b/libcxx/benchmarks/variant_visit_2.bench.cpp @@ -0,0 +1,22 @@ +#include "benchmark/benchmark.h" + +#include "VariantBenchmarks.h" + +using namespace VariantBenchmarks; + +BENCHMARK_TEMPLATE(BM_Visit, 2, 1); +BENCHMARK_TEMPLATE(BM_Visit, 2, 2); +BENCHMARK_TEMPLATE(BM_Visit, 2, 3); +BENCHMARK_TEMPLATE(BM_Visit, 2, 4); +BENCHMARK_TEMPLATE(BM_Visit, 2, 5); +BENCHMARK_TEMPLATE(BM_Visit, 2, 6); +BENCHMARK_TEMPLATE(BM_Visit, 2, 7); +BENCHMARK_TEMPLATE(BM_Visit, 2, 8); +BENCHMARK_TEMPLATE(BM_Visit, 2, 9); +BENCHMARK_TEMPLATE(BM_Visit, 2, 10); +BENCHMARK_TEMPLATE(BM_Visit, 2, 20); +BENCHMARK_TEMPLATE(BM_Visit, 2, 30); +BENCHMARK_TEMPLATE(BM_Visit, 2, 40); +BENCHMARK_TEMPLATE(BM_Visit, 2, 50); + +BENCHMARK_MAIN(); diff --git a/libcxx/benchmarks/variant_visit_3.bench.cpp b/libcxx/benchmarks/variant_visit_3.bench.cpp new file mode 100644 --- /dev/null +++ b/libcxx/benchmarks/variant_visit_3.bench.cpp @@ -0,0 +1,20 @@ +#include "benchmark/benchmark.h" + +#include "VariantBenchmarks.h" + +using namespace VariantBenchmarks; + +BENCHMARK_TEMPLATE(BM_Visit, 3, 1); +BENCHMARK_TEMPLATE(BM_Visit, 3, 2); +BENCHMARK_TEMPLATE(BM_Visit, 3, 3); +BENCHMARK_TEMPLATE(BM_Visit, 3, 4); +BENCHMARK_TEMPLATE(BM_Visit, 3, 5); +BENCHMARK_TEMPLATE(BM_Visit, 3, 6); +BENCHMARK_TEMPLATE(BM_Visit, 3, 7); +BENCHMARK_TEMPLATE(BM_Visit, 3, 8); +BENCHMARK_TEMPLATE(BM_Visit, 3, 9); +BENCHMARK_TEMPLATE(BM_Visit, 3, 10); +BENCHMARK_TEMPLATE(BM_Visit, 3, 15); +BENCHMARK_TEMPLATE(BM_Visit, 3, 20); + +BENCHMARK_MAIN();