xref: /llvm-project/libcxx/test/benchmarks/shared_mutex_vs_mutex.bench.cpp (revision b2d2494731976ab7aa9702f3134472db694b9332)
178b4b5ccSLouis Dionne //===----------------------------------------------------------------------===//
26a54dfbfSLouis Dionne //
378b4b5ccSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
478b4b5ccSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
578b4b5ccSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
678b4b5ccSLouis Dionne //
778b4b5ccSLouis Dionne //===----------------------------------------------------------------------===//
878b4b5ccSLouis Dionne 
9*b2d24947SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10*b2d24947SLouis Dionne 
1178b4b5ccSLouis Dionne // This benchmark compares the performance of std::mutex and std::shared_mutex in contended scenarios.
1278b4b5ccSLouis Dionne // it's meant to establish a baseline overhead for std::shared_mutex and std::mutex, and to help inform decisions about
1378b4b5ccSLouis Dionne // which mutex to use when selecting a mutex type for a given use case.
1478b4b5ccSLouis Dionne 
1578b4b5ccSLouis Dionne #include <atomic>
1678b4b5ccSLouis Dionne #include <mutex>
1778b4b5ccSLouis Dionne #include <numeric>
1878b4b5ccSLouis Dionne #include <shared_mutex>
1978b4b5ccSLouis Dionne #include <thread>
2078b4b5ccSLouis Dionne 
2178b4b5ccSLouis Dionne #include "benchmark/benchmark.h"
2278b4b5ccSLouis Dionne 
2378b4b5ccSLouis Dionne int global_value = 42;
2478b4b5ccSLouis Dionne std::mutex m;
2578b4b5ccSLouis Dionne std::shared_mutex sm;
2678b4b5ccSLouis Dionne 
2778b4b5ccSLouis Dionne static void BM_shared_mutex(benchmark::State& state) {
2878b4b5ccSLouis Dionne   for (auto _ : state) {
2978b4b5ccSLouis Dionne     std::shared_lock<std::shared_mutex> lock(sm);
3078b4b5ccSLouis Dionne     benchmark::DoNotOptimize(global_value);
3178b4b5ccSLouis Dionne   }
3278b4b5ccSLouis Dionne }
3378b4b5ccSLouis Dionne 
3478b4b5ccSLouis Dionne static void BM_mutex(benchmark::State& state) {
3578b4b5ccSLouis Dionne   for (auto _ : state) {
3678b4b5ccSLouis Dionne     std::lock_guard<std::mutex> lock(m);
3778b4b5ccSLouis Dionne     benchmark::DoNotOptimize(global_value);
3878b4b5ccSLouis Dionne   }
3978b4b5ccSLouis Dionne }
4078b4b5ccSLouis Dionne 
4178b4b5ccSLouis Dionne BENCHMARK(BM_shared_mutex)->Threads(1)->Threads(2)->Threads(4)->Threads(8)->Threads(32);
4278b4b5ccSLouis Dionne BENCHMARK(BM_mutex)->Threads(1)->Threads(2)->Threads(4)->Threads(8)->Threads(32);
4378b4b5ccSLouis Dionne 
4478b4b5ccSLouis Dionne BENCHMARK_MAIN();
45