今天我写了一些代码来测试互斥锁的性能。
这是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;
这是使用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 64位, 结果是:0.7020秒与2.1684秒,3.08倍。
boost :: mutex 将首先尝试 _interlockedbittestandset, 如果失败,则会使用大哥 WaitForSingleObject, 很容易理解。
看起来 VS2013 的 std :: mutex 更加复杂,我已经试图理解它,但我无法抓住重点, 为什么它如此复杂?有更快的方法吗?