Stavo discutendo con un collega di lock_guard e mi ha proposto che lock_guard è probabilmente più lento di mutex :: lock () / mutex :: unlock () a causa del costo di istanza e non istituzione della classe lock_guard.
Poi ho creato questo semplice test e, sorprendentemente, la versione con lock_guard è quasi due volte più veloce della versione con 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;
}
I risultati sulla mia macchina:
Take: 41 ms
Take: 22 ms
Qualcuno può chiarire perché e come può essere?
std::lock_guard
stato un po 'più lento, a meno che tu non possa dimostrare che è importante in termini di prestazioni, quel guadagno di velocità non invaliderà gli altri vantaggi dell'uso std::lock_guard
(principalmente RAII). Se g++
è tutto ciò che può lanciare o qualsiasi cosa che potrebbe cambiare in qualcosa di potenzialmente più complicato in futuro quasi necessario utilizzare una sorta di oggetto da possedere la serratura.