为什么boost :: mutex比vs2013的std :: mutex更快?

ama*_*ang 11 c++ performance boost mutex c++11

今天我写了一些代码来测试互斥锁的性能.

这是boost(1.54)版本,在vs2010上使用O2优化编译:

boost::mutex m;
auto start = boost::chrono::system_clock::now();
for (size_t i = 0; i < 50000000; ++i) {
    boost::lock_guard<boost::mutex> lock(m);
}
auto end = boost::chrono::system_clock::now();
boost::chrono::duration<double> elapsed_seconds = end - start;
std::cout << elapsed_seconds.count() << std::endl;
Run Code Online (Sandbox Code Playgroud)

这是在VS2013上编译的std版本,也有O2优化:

std::mutex m;
auto start = std::chrono::system_clock::now();
for (size_t i = 0; i < 50000000; ++i) {
    std::lock_guard<std::mutex> lock(m);
}
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << elapsed_seconds.count() << std::endl;
Run Code Online (Sandbox Code Playgroud)

有点不同但做同样的事情.我的CPU是Intel Core i7-2600K,我的操作系统是Windows 7 64bit,结果是:0.7020s vs 2.1684s,3.08倍.

boost :: mutex将首先尝试_interlockedbittestandset,如果失败,那么大奶酪WaitForSingleObject将排在第二位,它很容易理解.

似乎VS2013的std :: mutex要复杂得多,我已经尝试了解它,但我无法理解它,为什么它如此复杂?有更快的方法吗?

Jed*_*aaf 4

看起来stl::mutex可能只能使用系统调用,这需要大量的开销;但boost::mutex至少以编程方式实现了它的一些功能——即它尽可能避免系统调用,这将是try _interlockedbittestandset之前检查的原因WaitForSingleObject

我不知道 MS 的 stl 的实际内部结构,但我已经从操作系统类的示例中看到了这样的性能差异。