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