今天我写了一些代码来测试互斥体的性能.
这是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复杂得多,我已经有了
试图理解它,但我无法得到点,
为什么这么复杂?有更快的方法吗?