benchmarks/pool_allocator_benchmark.cpp (95 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates.
//
// This source code is licensed under the MIT license found in the
// LICENSE.md file in the root directory of this source tree.
#include <dispenso/pool_allocator.h>
#include <deque>
#include <dispenso/task_set.h>
#include "benchmark_common.h"
constexpr size_t kSmallSize = 1024;
constexpr size_t kMediumSize = 8192;
constexpr size_t kLargeSize = 65536;
template <typename Alloc, typename Free>
void run(benchmark::State& state, Alloc alloc, Free dealloc) {
std::vector<char*> ptrs(state.range(0));
for (auto UNUSED_VAR : state) {
for (char*& p : ptrs) {
p = alloc();
}
for (char* p : ptrs) {
dealloc(p);
}
}
}
template <size_t kSize>
void BM_mallocfree(benchmark::State& state) {
run(
state,
[]() { return reinterpret_cast<char*>(::malloc(kSize)); },
[](char* buf) { ::free(buf); });
}
template <size_t kSize>
void BM_pool_allocator(benchmark::State& state) {
dispenso::PoolAllocator allocator(kSize, kSize * 32, ::malloc, ::free);
run(
state,
[&allocator]() { return allocator.alloc(); },
[&allocator](char* buf) { allocator.dealloc(buf); });
}
template <size_t kThreads, typename Alloc, typename Free>
void runThreaded(benchmark::State& state, Alloc alloc, Free dealloc) {
dispenso::resizeGlobalThreadPool(kThreads);
std::vector<char*> ptrsArray[kThreads];
for (auto& ptrs : ptrsArray) {
ptrs.resize(state.range(0));
}
for (auto UNUSED_VAR : state) {
dispenso::TaskSet tasks(dispenso::globalThreadPool());
for (size_t i = 0; i < kThreads; ++i) {
tasks.schedule([alloc, dealloc, &ptrs = ptrsArray[i]]() {
for (char*& p : ptrs) {
p = alloc();
}
for (char* p : ptrs) {
dealloc(p);
}
});
}
}
}
template <size_t kSize, size_t kThreads>
void BM_mallocfree_threaded(benchmark::State& state) {
runThreaded<kThreads>(
state,
[]() { return reinterpret_cast<char*>(::malloc(kSize)); },
[](char* buf) { ::free(buf); });
}
template <size_t kSize, size_t kThreads>
void BM_pool_allocator_threaded(benchmark::State& state) {
dispenso::PoolAllocator allocator(kSize, (1 << 20), ::malloc, ::free);
runThreaded<kThreads>(
state,
[&allocator]() { return allocator.alloc(); },
[&allocator](char* buf) { allocator.dealloc(buf); });
}
BENCHMARK_TEMPLATE(BM_mallocfree, kSmallSize)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE(BM_pool_allocator, kSmallSize)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE(BM_mallocfree, kMediumSize)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE(BM_pool_allocator, kMediumSize)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE(BM_mallocfree, kLargeSize)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE(BM_pool_allocator, kLargeSize)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kSmallSize, 2)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kSmallSize, 2)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kMediumSize, 2)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kMediumSize, 2)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kLargeSize, 2)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kLargeSize, 2)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kSmallSize, 8)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kSmallSize, 8)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kMediumSize, 8)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kMediumSize, 8)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kLargeSize, 8)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kLargeSize, 8)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kSmallSize, 16)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kSmallSize, 16)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kMediumSize, 16)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kMediumSize, 16)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_mallocfree_threaded, kLargeSize, 16)->Range(1 << 13, 1 << 15);
BENCHMARK_TEMPLATE2(BM_pool_allocator_threaded, kLargeSize, 16)->Range(1 << 13, 1 << 15);
BENCHMARK_MAIN();