blob: 84729ebe013df5fa6aaab2d1c7b502c20078d81f [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// 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();