मैं एक सहकर्मी के साथ बहस कर रहा था, लॉक_गार्ड के बारे में, और उसने प्रस्ताव दिया कि इंस्टेंट की लागत के कारण लॉक_गार्ड म्यूटेक्स की तुलना में बहुत धीमा है।
तब मैंने यह सरल परीक्षण बनाया और, आश्चर्य की बात यह है कि लॉक_गार्ड वाला संस्करण म्यूटेक्स :: लॉक () / म्यूटेक्स :: अनलॉक () के साथ संस्करण की तुलना में लगभग दो गुना तेज है।
#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++
ऐसा कुछ है जो फेंक सकता है या ऐसा कुछ भी हो सकता है जो भविष्य में संभावित रूप से अधिक जटिल हो सकता है तो आपको लॉक के मालिक के लिए किसी प्रकार की वस्तु का उपयोग करना होगा।