我正在与一位同事讨论关于lock_guard的问题,他提出lock_guard可能比Mutex :: lock()/ Mutex :: unlock()慢,原因是实例化和取消使class lock_guard变得不安全。
然后我创建了这个简单的测试,令人惊讶的是,使用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
有人可以澄清为什么以及怎么做吗?
答案 0 :(得分:6)
两个版本的发行版生成的结果相同。
DEBUG
构建func2
的时间延长了约33%;我在反汇编中看到的差异是func2
使用__security_cookie
并调用@_RTC_CheckStackVars@8
。
您是否在安排调试时间?
编辑:
另外,在查看RELEASE
的反汇编时,我注意到mutex
方法已保存在两个注册表中:
010F104E mov edi,dword ptr [__imp___Mtx_lock (010F3060h)]
010F1054 xor esi,esi
010F1056 mov ebx,dword ptr [__imp___Mtx_unlock (010F3054h)]
,并从func1
和func2
进行相同的调用:
010F1067 call edi
....
010F107F call ebx