Like some of the atomic_wait benchmarks, it is very expensive and only intended for A/B comparisons when actively investigating.
49 lines
1.6 KiB
C++
49 lines
1.6 KiB
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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// UNSUPPORTED: c++03, c++11, c++14
|
|
|
|
// This benchmark is very expensive and we don't want to run it on a regular basis,
|
|
// only to ensure the code doesn't rot.
|
|
// REQUIRES: enable-benchmarks=dry-run
|
|
|
|
// This benchmark compares the performance of std::mutex and std::shared_mutex in contended scenarios.
|
|
// it's meant to establish a baseline overhead for std::shared_mutex and std::mutex, and to help inform decisions about
|
|
// which mutex to use when selecting a mutex type for a given use case.
|
|
|
|
#include <atomic>
|
|
#include <mutex>
|
|
#include <numeric>
|
|
#include <shared_mutex>
|
|
#include <thread>
|
|
|
|
#include "benchmark/benchmark.h"
|
|
|
|
int global_value = 42;
|
|
std::mutex m;
|
|
std::shared_mutex sm;
|
|
|
|
static void BM_shared_mutex(benchmark::State& state) {
|
|
for (auto _ : state) {
|
|
std::shared_lock<std::shared_mutex> lock(sm);
|
|
benchmark::DoNotOptimize(global_value);
|
|
}
|
|
}
|
|
|
|
static void BM_mutex(benchmark::State& state) {
|
|
for (auto _ : state) {
|
|
std::lock_guard<std::mutex> lock(m);
|
|
benchmark::DoNotOptimize(global_value);
|
|
}
|
|
}
|
|
|
|
BENCHMARK(BM_shared_mutex)->Threads(1)->Threads(2)->Threads(4)->Threads(8)->Threads(32);
|
|
BENCHMARK(BM_mutex)->Threads(1)->Threads(2)->Threads(4)->Threads(8)->Threads(32);
|
|
|
|
BENCHMARK_MAIN();
|