summaryrefslogtreecommitdiffstats
path: root/lib/libcxx/benchmarks/function.bench.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2021-01-11 15:31:56 +0000
committerpatrick <patrick@openbsd.org>2021-01-11 15:31:56 +0000
commit16ff81ed8b1ed9aa06fb1a731a2446b66cc49bef (patch)
tree1a7dd8152b94f6f8cd318bfaf85aa40882854583 /lib/libcxx/benchmarks/function.bench.cpp
parentsync (diff)
downloadwireguard-openbsd-16ff81ed8b1ed9aa06fb1a731a2446b66cc49bef.tar.xz
wireguard-openbsd-16ff81ed8b1ed9aa06fb1a731a2446b66cc49bef.zip
Remove libc++ and libc++abi 8.0.0 now that we switched to version 10.0.1
in the gnu/ directory.
Diffstat (limited to 'lib/libcxx/benchmarks/function.bench.cpp')
-rw-r--r--lib/libcxx/benchmarks/function.bench.cpp232
1 files changed, 0 insertions, 232 deletions
diff --git a/lib/libcxx/benchmarks/function.bench.cpp b/lib/libcxx/benchmarks/function.bench.cpp
deleted file mode 100644
index 4f0e1fd80fa..00000000000
--- a/lib/libcxx/benchmarks/function.bench.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include <cstdint>
-#include <functional>
-#include <memory>
-#include <string>
-
-#include "CartesianBenchmarks.hpp"
-#include "benchmark/benchmark.h"
-#include "test_macros.h"
-
-namespace {
-
-enum class FunctionType {
- Null,
- FunctionPointer,
- MemberFunctionPointer,
- MemberPointer,
- SmallTrivialFunctor,
- SmallNonTrivialFunctor,
- LargeTrivialFunctor,
- LargeNonTrivialFunctor
-};
-
-struct AllFunctionTypes : EnumValuesAsTuple<AllFunctionTypes, FunctionType, 8> {
- static constexpr const char* Names[] = {"Null",
- "FuncPtr",
- "MemFuncPtr",
- "MemPtr",
- "SmallTrivialFunctor",
- "SmallNonTrivialFunctor",
- "LargeTrivialFunctor",
- "LargeNonTrivialFunctor"};
-};
-
-enum class Opacity { kOpaque, kTransparent };
-
-struct AllOpacity : EnumValuesAsTuple<AllOpacity, Opacity, 2> {
- static constexpr const char* Names[] = {"Opaque", "Transparent"};
-};
-
-struct S {
- int function() const { return 0; }
- int field = 0;
-};
-
-int FunctionWithS(const S*) { return 0; }
-
-struct SmallTrivialFunctor {
- int operator()(const S*) const { return 0; }
-};
-struct SmallNonTrivialFunctor {
- SmallNonTrivialFunctor() {}
- SmallNonTrivialFunctor(const SmallNonTrivialFunctor&) {}
- ~SmallNonTrivialFunctor() {}
- int operator()(const S*) const { return 0; }
-};
-struct LargeTrivialFunctor {
- LargeTrivialFunctor() {
- // Do not spend time initializing the padding.
- }
- int padding[16];
- int operator()(const S*) const { return 0; }
-};
-struct LargeNonTrivialFunctor {
- int padding[16];
- LargeNonTrivialFunctor() {
- // Do not spend time initializing the padding.
- }
- LargeNonTrivialFunctor(const LargeNonTrivialFunctor&) {}
- ~LargeNonTrivialFunctor() {}
- int operator()(const S*) const { return 0; }
-};
-
-using Function = std::function<int(const S*)>;
-
-TEST_ALWAYS_INLINE
-inline Function MakeFunction(FunctionType type, bool opaque = false) {
- switch (type) {
- case FunctionType::Null:
- return nullptr;
- case FunctionType::FunctionPointer:
- return maybeOpaque(FunctionWithS, opaque);
- case FunctionType::MemberFunctionPointer:
- return maybeOpaque(&S::function, opaque);
- case FunctionType::MemberPointer:
- return maybeOpaque(&S::field, opaque);
- case FunctionType::SmallTrivialFunctor:
- return maybeOpaque(SmallTrivialFunctor{}, opaque);
- case FunctionType::SmallNonTrivialFunctor:
- return maybeOpaque(SmallNonTrivialFunctor{}, opaque);
- case FunctionType::LargeTrivialFunctor:
- return maybeOpaque(LargeTrivialFunctor{}, opaque);
- case FunctionType::LargeNonTrivialFunctor:
- return maybeOpaque(LargeNonTrivialFunctor{}, opaque);
- }
-}
-
-template <class Opacity, class FunctionType>
-struct ConstructAndDestroy {
- static void run(benchmark::State& state) {
- for (auto _ : state) {
- if (Opacity() == ::Opacity::kOpaque) {
- benchmark::DoNotOptimize(MakeFunction(FunctionType(), true));
- } else {
- MakeFunction(FunctionType());
- }
- }
- }
-
- static std::string name() {
- return "BM_ConstructAndDestroy" + FunctionType::name() + Opacity::name();
- }
-};
-
-template <class FunctionType>
-struct Copy {
- static void run(benchmark::State& state) {
- auto value = MakeFunction(FunctionType());
- for (auto _ : state) {
- benchmark::DoNotOptimize(value);
- auto copy = value; // NOLINT
- benchmark::DoNotOptimize(copy);
- }
- }
-
- static std::string name() { return "BM_Copy" + FunctionType::name(); }
-};
-
-template <class FunctionType>
-struct Move {
- static void run(benchmark::State& state) {
- Function values[2] = {MakeFunction(FunctionType())};
- int i = 0;
- for (auto _ : state) {
- benchmark::DoNotOptimize(values);
- benchmark::DoNotOptimize(values[i ^ 1] = std::move(values[i]));
- i ^= 1;
- }
- }
-
- static std::string name() {
- return "BM_Move" + FunctionType::name();
- }
-};
-
-template <class Function1, class Function2>
-struct Swap {
- static void run(benchmark::State& state) {
- Function values[2] = {MakeFunction(Function1()), MakeFunction(Function2())};
- for (auto _ : state) {
- benchmark::DoNotOptimize(values);
- values[0].swap(values[1]);
- }
- }
-
- static bool skip() { return Function1() > Function2(); }
-
- static std::string name() {
- return "BM_Swap" + Function1::name() + Function2::name();
- }
-};
-
-template <class FunctionType>
-struct OperatorBool {
- static void run(benchmark::State& state) {
- auto f = MakeFunction(FunctionType());
- for (auto _ : state) {
- benchmark::DoNotOptimize(f);
- benchmark::DoNotOptimize(static_cast<bool>(f));
- }
- }
-
- static std::string name() { return "BM_OperatorBool" + FunctionType::name(); }
-};
-
-template <class FunctionType>
-struct Invoke {
- static void run(benchmark::State& state) {
- S s;
- const auto value = MakeFunction(FunctionType());
- for (auto _ : state) {
- benchmark::DoNotOptimize(value);
- benchmark::DoNotOptimize(value(&s));
- }
- }
-
- static bool skip() { return FunctionType() == ::FunctionType::Null; }
-
- static std::string name() { return "BM_Invoke" + FunctionType::name(); }
-};
-
-template <class FunctionType>
-struct InvokeInlined {
- static void run(benchmark::State& state) {
- S s;
- for (auto _ : state) {
- MakeFunction(FunctionType())(&s);
- }
- }
-
- static bool skip() { return FunctionType() == ::FunctionType::Null; }
-
- static std::string name() {
- return "BM_InvokeInlined" + FunctionType::name();
- }
-};
-
-} // namespace
-
-int main(int argc, char** argv) {
- benchmark::Initialize(&argc, argv);
- if (benchmark::ReportUnrecognizedArguments(argc, argv))
- return 1;
-
- makeCartesianProductBenchmark<ConstructAndDestroy, AllOpacity,
- AllFunctionTypes>();
- makeCartesianProductBenchmark<Copy, AllFunctionTypes>();
- makeCartesianProductBenchmark<Move, AllFunctionTypes>();
- makeCartesianProductBenchmark<Swap, AllFunctionTypes, AllFunctionTypes>();
- makeCartesianProductBenchmark<OperatorBool, AllFunctionTypes>();
- makeCartesianProductBenchmark<Invoke, AllFunctionTypes>();
- makeCartesianProductBenchmark<InvokeInlined, AllFunctionTypes>();
- benchmark::RunSpecifiedBenchmarks();
-}