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();
|