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

前端之家收集整理的这篇文章主要介绍了c – 为什么boost :: mutex比vs2013的std :: mutex更快?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天我写了一些代码来测试互斥体的性能.

这是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;

而这是std版本,编译在VS2013上,也带有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;

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

boost :: mutex将首先尝试_interlockedbittestandset,
如果失败了,大奶酪WaitForSingleObject将会来到第二,
很容易理解

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

解决方法

似乎stl :: mutex只能使用系统调用,这需要大量的开销;但是boost :: mutex通过编程方式至少实现其一些功能 – 即尽可能地避免系统调用,这将是WaitForSingleObject之前try _interlockedbittestandset检查的原因.

我不知道MS的stl的实际内部,但是我从操作系统类的例子中看到了这样的性能差异.

猜你在找的C&C++相关文章