Je discutais avec un collègue à propos de lock_guard, et il a proposé que lock_guard soit probablement plus lent que mutex :: lock () / mutex :: unlock () en raison du coût d'instanciation et de non-différenciation de la classe lock_guard.
Ensuite, j'ai créé ce test simple et, étonnamment, la version avec lock_guard est presque deux fois plus rapide que la version avec 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;
}
Les résultats sur ma machine:
Take: 41 ms
Take: 22 ms
Quelqu'un peut-il clarifier pourquoi et comment cela peut être?
std::lock_guard
était un peu plus lent, à moins que vous ne puissiez prouver qu'il est important en termes de performances, ce gain de vitesse n'invalidera pas les autres avantages de l'utilisationstd::lock_guard
(principalement RAII). Sig++
quelque chose qui peut jeter ou tout ce qui pourrait se transformer en quelque chose de potentiellement plus compliqué à l'avenir vous presque devez utiliser une sorte d'objet à posséder la serrure.Réponses:
La version finale produit le même résultat pour les deux versions.
La
DEBUG
construction affiche un temps de ~ 33% plus long pourfunc2
; la différence que je vois dans le démontage quifunc2
utilise__security_cookie
et invoque@_RTC_CheckStackVars@8
.Vous chronométrez DEBUG?
EDIT: De plus, en regardant le
RELEASE
démontage, j'ai remarqué que lesmutex
méthodes étaient enregistrées dans deux registres:et appelé de la même façon des deux
func1
etfunc2
:la source