[libcxx-commits] [libcxx] c6f5137 - [libcxx/variant] Add a few benchmarks for `std::visit`.
Michael Park via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Aug 11 15:50:02 PDT 2020
Author: Michael Park
Date: 2020-08-11T15:48:56-07:00
New Revision: c6f51377e12b343ca2f712b6af6908555f07ad04
URL: https://github.com/llvm/llvm-project/commit/c6f51377e12b343ca2f712b6af6908555f07ad04
DIFF: https://github.com/llvm/llvm-project/commit/c6f51377e12b343ca2f712b6af6908555f07ad04.diff
LOG: [libcxx/variant] Add a few benchmarks for `std::visit`.
This patch adds a few `std::visit` benchmarks as a starting point.
Reviewed By: ldionne, #libc
Differential Revision: https://reviews.llvm.org/D85419
Added:
libcxx/benchmarks/VariantBenchmarks.h
libcxx/benchmarks/variant_visit_1.bench.cpp
libcxx/benchmarks/variant_visit_2.bench.cpp
libcxx/benchmarks/variant_visit_3.bench.cpp
Modified:
Removed:
################################################################################
diff --git a/libcxx/benchmarks/VariantBenchmarks.h b/libcxx/benchmarks/VariantBenchmarks.h
new file mode 100644
index 000000000000..2feaeab51b97
--- /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 <array>
+#include <cstddef>
+#include <tuple>
+#include <type_traits>
+#include <variant>
+
+#include "benchmark/benchmark.h"
+
+#include "GenerateInput.h"
+
+namespace VariantBenchmarks {
+
+template <std::size_t I>
+struct S {
+ static constexpr size_t v = I;
+};
+
+template <std::size_t N, std::size_t... Is>
+static auto genVariants(std::index_sequence<Is...>) {
+ using V = std::variant<S<Is>...>;
+ using F = V (*)();
+ static constexpr F fs[] = {[] { return V(std::in_place_index<Is>); }...};
+
+ std::array<V, N> result = {};
+ for (auto& v : result) {
+ v = fs[getRandomInteger(0ul, sizeof...(Is) - 1)]();
+ }
+
+ return result;
+}
+
+template <std::size_t N, std::size_t Alts>
+static void BM_Visit(benchmark::State& state) {
+ auto args = genVariants<N>(std::make_index_sequence<Alts>{});
+ 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
index 000000000000..7d736f8abb16
--- /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
index 000000000000..ed26cd44c3a9
--- /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
index 000000000000..b20d50391f26
--- /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();
More information about the libcxx-commits
mailing list