std :: lock_guard如何比std :: mutex :: lock()更快?

时间:2019-12-09 20:30:16

标签: c++ mutex

我正在与一位同事讨论关于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

有人可以澄清为什么以及怎么做吗?

1 个答案:

答案 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)]  

,并从func1func2进行相同的调用:

010F1067  call        edi  
....
010F107F  call        ebx