[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