aboutsummaryrefslogtreecommitdiff
path: root/libcxx/test/benchmarks/shared_mutex_vs_mutex.bench.cpp
blob: 84729ebe013df5fa6aaab2d1c7b502c20078d81f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//===----------------------------------------------------------------------===//
//
// 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();