কীভাবে স্ট্যান্ড :: লক_গার্ড স্ট্যান্ড :: মিটেক্স :: লক () এর চেয়ে দ্রুত হতে পারে?


9

লক_গার্ড সম্পর্কে আমি একজন সহকর্মীর সাথে তর্ক করছিলাম এবং তিনি প্রস্তাব করেছিলেন যে ক্লাসের লক_গার্ডটি ইনস্ট্যান্টিয়েট এবং নির্বিঘ্ন করার ব্যয়ের কারণে লক_গার্ডটি সম্ভবত মুটেক্স :: লক () / মুটেক্স :: আনলক () এর চেয়ে ধীরে ধীরে কম।

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

কেউ কীভাবে এবং কীভাবে হতে পারে তা স্পষ্ট করে বলতে পারেন?


2
এবং আপনি কতবার পরিমাপ করেছেন?
আর্টেম

7
দয়া করে আপনার সংকলক পতাকা পোস্ট করুন ... বেঞ্চমার্কিং অপ্টিমাইজেশন স্তরের উপর নির্ভর করবে ...
ম্যাকমেড

10
প্রো টিপ: এটির মতো পরিমাপ করার সময়, বিষয়টি নিশ্চিত করার জন্য এটি কেবল শীতল ডেটা / নির্দেশনা নয় তা নিশ্চিত করার জন্য আদেশটি অদলবদল করুন: coliru.stacked-crooked.com/a/81f75a1ab52cb1cc
নাথান ওলিভার

2
এই জাতীয় পরিমাপ করার সময় সহায়ক আরেকটি জিনিস: পুরো জিনিসটিকে একটি বৃহত লুপে রাখুন, যাতে আপনি পুরো পরিমাপ সেটটি চালান, বলুন, প্রতিটি রান 20 বার করুন। সাধারণত পরবর্তী পরিমাপগুলি হ'ল প্রকৃত অর্থবহ, কারণ ততক্ষণে ক্যাশে দীর্ঘমেয়াদে যাবতীয় আচরণ হওয়ার সম্ভাবনা রয়েছে।
মার্ক Phaedrus

2
এমনকি যদি std::lock_guardকিছুটা ধীর ছিল তবে আপনি যদি প্রমাণ করতে না পারেন যে এটি পারফরম্যান্সের ক্ষেত্রে গুরুত্বপূর্ণ, গতি বৃদ্ধি লাভের std::lock_guard(মূলত RAII) ব্যবহারের অন্যান্য সুবিধাগুলি বাতিল করে না । যদি g++কিছু নিক্ষেপ কিছু কিছু সম্ভাব্য ভবিষ্যতে আপনি প্রায় যে জটিল মধ্যে পরিবর্তন করতে পারে পারে আছে লক মালিক বস্তুর কিছু বাছাই ব্যবহার করতে।
ফ্রান্সোইস অ্যান্ড্রিউস

উত্তর:


6

রিলিজ বিল্ড উভয় সংস্করণের জন্য একই ফলাফল উত্পাদন করে।

DEBUGবিল্ড শো জন্য ~ 33% দীর্ঘ সময় func2; অপ্রয়োজনে যে পার্থক্যটি আমি দেখতে পাই তা func2ব্যবহার করে __security_cookieএবং প্রার্থনা করে @_RTC_CheckStackVars@8

আপনি কি সময় ঠিক করছেন?

সম্পাদনা: অতিরিক্তভাবে, RELEASEবিচ্ছিন্নতার দিকে তাকানোর সময় আমি লক্ষ্য করেছি যে mutexদুটি পদ্ধতিতে দুটি পদ্ধতি সংরক্ষণ করা হয়েছিল:

010F104E  mov         edi,dword ptr [__imp___Mtx_lock (010F3060h)]  
010F1054  xor         esi,esi  
010F1056  mov         ebx,dword ptr [__imp___Mtx_unlock (010F3054h)]  

এবং উভয় থেকেই একইভাবে ডাকা হয়েছে func1এবং func2:

010F1067  call        edi  
....
010F107F  call        ebx  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.