Я сперечався з колегою, про lock_guard, і він запропонував, щоб lock_guard був повільніше повільний, ніж mutex :: lock () / mutex :: unlock () через вартість екземпляра та unistantiate класу lock_guard.
Тоді я створив цей простий тест і, несподівано, версія з lock_guard майже в два рази швидша за версію з mutex :: lock () / mutex :: 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
Може хтось уточнить, чому і як це може бути?
std::lock_guard
було трохи повільніше, якщо ви не зможете довести, що це має значення з точки зору продуктивності, збільшення швидкості не призведе до недійсності інших переваг використання std::lock_guard
(в основному RAII). Якщо що- g++
небудь може кинути або що-небудь, що може перетворитися на щось потенційно складніше в майбутньому, вам майже доведеться використовувати якийсь об’єкт, щоб володіти замком.