【发布时间】:2019-11-07 20:41:48
【问题描述】:
我使用 google benchmark 运行了以下 3 次测试,结果让我感到惊讶,因为 RW 锁在发布模式下比简单互斥锁慢约 4 倍。 (并且在调试模式下比简单的互斥锁慢约 10 倍)
void raw_access() {
(void) (gp->a + gp->b);
}
void mutex_access() {
std::lock_guard<std::mutex> guard(g_mutex);
(void) (gp->a + gp->b);
}
void rw_mutex_access() {
boost::shared_lock<boost::shared_mutex> l(g_rw_mutex);
(void) (gp->a + gp->b);
}
结果是:
2019-06-26 08:30:45
Running ./perf
Run on (4 X 2500 MHz CPU s)
CPU Caches:
L1 Data 32K (x2)
L1 Instruction 32K (x2)
L2 Unified 262K (x2)
L3 Unified 4194K (x1)
Load Average: 5.35, 3.22, 2.57
-----------------------------------------------------------
Benchmark Time CPU Iterations
-----------------------------------------------------------
BM_RawAccess 1.01 ns 1.01 ns 681922241
BM_MutexAccess 18.2 ns 18.2 ns 38479510
BM_RWMutexAccess 92.8 ns 92.8 ns 7561437
我没有通过谷歌获得足够的信息,所以希望在这里得到一些帮助。
谢谢
【问题讨论】:
-
嗯,共享互斥锁要复杂得多……这不是预期的结果吗?另外,您正在将
std::mutex与boost::shared_mutex进行比较,请尝试改用std::shared_mutex。 -
感谢@CruzJean 提供 std::shared_mutex。成本从 96ns 降低到 38ns。 “这不是预期的结果吗?”实际上,我想要一些有关复杂性的更多信息。现在 std::shared_mutex 和 std::mutex 只有 2 倍的差异,所以可以预期。
标签: c++ boost boost-thread