Lock_guard hakkında bir meslektaşımla tartışıyordum ve sınıfın lock_guard örneğini oluşturup unistantiate nedeniyle lock_guard'ın mutex :: lock () / mutex :: unlock () 'den daha yavaş olduğunu önerdi.
Sonra bu basit testi oluşturdum ve şaşırtıcı bir şekilde, lock_guard olan sürüm mutex :: lock () / mutex :: unlock () sürümüne göre neredeyse iki kat daha hızlı
#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;
}
Makinemdeki sonuçlar:
Take: 41 ms
Take: 22 ms
Birisi bunun neden ve nasıl olabileceğini açıklığa kavuşturabilir mi?
std::lock_guard
Biraz daha yavaş olsa bile , performans açısından önemli olduğunu kanıtlayamazsanız, bu hız kazancı, kullanımın diğer faydalarını std::lock_guard
(esas olarak RAII) geçersiz kılmaz . Eğer g++
atmak veya potansiyel olarak daha neredeyse gelecekte karmaşık bir hale değişebilir şey bir şey olduğunu var kilidi kendi nesne çeşit kullanmak.