diff options
author | 2021-01-02 20:29:13 +0000 | |
---|---|---|
committer | 2021-01-02 20:29:13 +0000 | |
commit | 46035553bfdd96e63c94e32da0210227ec2e3cf1 (patch) | |
tree | b191f708fb9a2995ba745b2f31cdeeaee4872b7f /gnu/llvm/libcxx/benchmarks/allocation.bench.cpp | |
parent | Move Makefiles for libc++ and libc++abi to gnu/lib in preparation for an (diff) | |
download | wireguard-openbsd-46035553bfdd96e63c94e32da0210227ec2e3cf1.tar.xz wireguard-openbsd-46035553bfdd96e63c94e32da0210227ec2e3cf1.zip |
Import libc++ 10.0.1 release.
Diffstat (limited to 'gnu/llvm/libcxx/benchmarks/allocation.bench.cpp')
-rw-r--r-- | gnu/llvm/libcxx/benchmarks/allocation.bench.cpp | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/gnu/llvm/libcxx/benchmarks/allocation.bench.cpp b/gnu/llvm/libcxx/benchmarks/allocation.bench.cpp new file mode 100644 index 00000000000..236e74044a5 --- /dev/null +++ b/gnu/llvm/libcxx/benchmarks/allocation.bench.cpp @@ -0,0 +1,136 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "benchmark/benchmark.h" + +#include <new> +#include <vector> +#include <cassert> + +struct PointerList { + PointerList* Next = nullptr; +}; + +struct MallocWrapper { + __attribute__((always_inline)) + static void* Allocate(size_t N) { + return std::malloc(N); + } + __attribute__((always_inline)) + static void Deallocate(void* P, size_t) { + std::free(P); + } +}; + +struct NewWrapper { + __attribute__((always_inline)) + static void* Allocate(size_t N) { + return ::operator new(N); + } + __attribute__((always_inline)) + static void Deallocate(void* P, size_t) { + ::operator delete(P); + } +}; + +struct BuiltinNewWrapper { + __attribute__((always_inline)) + static void* Allocate(size_t N) { + return __builtin_operator_new(N); + } + __attribute__((always_inline)) + static void Deallocate(void* P, size_t) { + __builtin_operator_delete(P); + } +}; + +struct BuiltinSizedNewWrapper { + __attribute__((always_inline)) + static void* Allocate(size_t N) { + return __builtin_operator_new(N); + } + __attribute__((always_inline)) + static void Deallocate(void* P, size_t N) { + __builtin_operator_delete(P, N); + } +}; + + +template <class AllocWrapper> +static void BM_AllocateAndDeallocate(benchmark::State& st) { + const size_t alloc_size = st.range(0); + while (st.KeepRunning()) { + void* p = AllocWrapper::Allocate(alloc_size); + benchmark::DoNotOptimize(p); + AllocWrapper::Deallocate(p, alloc_size); + } +} + + +template <class AllocWrapper> +static void BM_AllocateOnly(benchmark::State& st) { + const size_t alloc_size = st.range(0); + PointerList *Start = nullptr; + + while (st.KeepRunning()) { + PointerList* p = (PointerList*)AllocWrapper::Allocate(alloc_size); + benchmark::DoNotOptimize(p); + p->Next = Start; + Start = p; + } + + PointerList *Next = Start; + while (Next) { + PointerList *Tmp = Next; + Next = Tmp->Next; + AllocWrapper::Deallocate(Tmp, alloc_size); + } +} + +template <class AllocWrapper> +static void BM_DeallocateOnly(benchmark::State& st) { + const size_t alloc_size = st.range(0); + const auto NumAllocs = st.max_iterations; + + using PtrT = void*; + std::vector<void*> Pointers(NumAllocs); + for (auto& p : Pointers) { + p = AllocWrapper::Allocate(alloc_size); + } + + void** Data = Pointers.data(); + void** const End = Pointers.data() + Pointers.size(); + while (st.KeepRunning()) { + AllocWrapper::Deallocate(*Data, alloc_size); + Data += 1; + } + assert(Data == End); +} + +static int RegisterAllocBenchmarks() { + using FnType = void(*)(benchmark::State&); + struct { + const char* name; + FnType func; + } TestCases[] = { + {"BM_Malloc", &BM_AllocateAndDeallocate<MallocWrapper>}, + {"BM_New", &BM_AllocateAndDeallocate<NewWrapper>}, + {"BM_BuiltinNewDelete", BM_AllocateAndDeallocate<BuiltinNewWrapper>}, + {"BM_BuiltinSizedNewDelete", BM_AllocateAndDeallocate<BuiltinSizedNewWrapper>}, + {"BM_BuiltinNewAllocateOnly", BM_AllocateOnly<BuiltinSizedNewWrapper>}, + {"BM_BuiltinNewSizedDeallocateOnly", BM_DeallocateOnly<BuiltinSizedNewWrapper>}, + + }; + for (auto TC : TestCases) { + benchmark::RegisterBenchmark(TC.name, TC.func)->Range(16, 4096 * 2); + } + return 0; +} +int Sink = RegisterAllocBenchmarks(); + +BENCHMARK_MAIN(); |