Mercurial > hg > CbC > CbC_llvm
view libcxx/benchmarks/allocation.bench.cpp @ 174:f935e5e0dbe7
merged
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 12:28:41 +0900 |
parents | 1d019706d866 |
children | c4bab56944e8 |
line wrap: on
line source
//===----------------------------------------------------------------------===// // // 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();