[我正在和一位同事争论关于lock_guard,并且他认为,由于实例化和取消使class lock_guard的成本高昂,lock_guard可能比Mutex :: lock()/ Mutex :: unlock()慢。
然后我创建了这个简单的测试,令人惊讶的是,具有lock_guard的版本比具有互斥锁:: lock()/互斥锁:: unlock()的版本快两倍。
#include <iostream> #include <mutex> #include <chrono> std::mutex m; int g = 0; void func1() { m.lock(); g++; m.unlock(); } void func2() { std::lock_guard<std::mutex> lock(m); g++; } int main() { auto t = std::chrono::system_clock::now(); for (int i = 0; i < 1000000; i++) { func1(); } std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl; t = std::chrono::system_clock::now(); for (int i = 0; i < 1000000; i++) { func2(); } std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl; return 0; }
我的机器上的结果:
Take: 41 ms Take: 22 ms
有人可以阐明原因和方式吗?
我正在和一位同事争论关于lock_guard,并且他认为lock_guard可能比Mutex :: lock()/ Mutex :: unlock()慢,原因是实例化和取消类的开销...
发行版对两个版本产生相同的结果。
DEBUG
版本显示func2
的时间增加了〜33%;我在反汇编中看到的差异是func2
使用__security_cookie
并调用@_RTC_CheckStackVars@8
。