লক_গার্ড সম্পর্কে আমি একজন সহকর্মীর সাথে তর্ক করছিলাম এবং তিনি প্রস্তাব করেছিলেন যে ক্লাসের লক_গার্ডটি ইনস্ট্যান্টিয়েট এবং নির্বিঘ্ন করার ব্যয়ের কারণে লক_গার্ডটি সম্ভবত মুটেক্স :: লক () / মুটেক্স :: আনলক () এর চেয়ে ধীরে ধীরে কম।
তারপরে আমি এই সাধারণ পরীক্ষাটি তৈরি করেছি এবং আশ্চর্যরূপে, লক_গার্ড সহ সংস্করণটি মুউটেক্স :: লক () / মুটেক্স :: আনলক () সহ সংস্করণের চেয়ে প্রায় দ্বিগুণ গতিযুক্ত is
#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++
কিছু নিক্ষেপ কিছু কিছু সম্ভাব্য ভবিষ্যতে আপনি প্রায় যে জটিল মধ্যে পরিবর্তন করতে পারে পারে আছে লক মালিক বস্তুর কিছু বাছাই ব্যবহার করতে।