इसे गतिशील सरणी पर एसटीएल का उपयोग करने के लिए प्रोत्साहित किया जाता है लेकिन मैं उत्सुक हूं कि बाधा क्या हो सकती है? MAX_PACKET_LENGTH 32768 है।

---------------------------------------------------------------------------
Benchmark                                    Time           CPU Iterations
---------------------------------------------------------------------------
BM_VectorInit                             1335 ns       1193 ns     497778
BM_RawInit                                  58 ns         55 ns   10000000


static void BM_VectorInit(benchmark::State &state)
{
    for (auto _ : state) 
    {
        std::vector<char> a(MAX_PACKET_LENGTH);
    }
}

static void BM_RawInit(benchmark::State &state)
{
    for (auto _ : state) 
    {
        auto a = new char[MAX_PACKET_LENGTH];
        delete[] a;
    }
}
-2
Damian Kalinowski 16 मई 2018, 00:23

1 उत्तर

आप ढेर पर एक सरणी आवंटित करने की लागत के साथ std::vector बनाने की लागत की तुलना कर रहे हैं। जब आप एक std::vector बनाते हैं, तो यह आंतरिक रूप से ढेर पर एक सरणी आवंटित करता है, लेकिन अतिरिक्त ओवरहेड होता है क्योंकि std::vector स्वयं एक वस्तु है जिसे बनाने और संग्रहीत करने की आवश्यकता होती है (संभवतः स्टैक पर या ढेर)। इसलिए, एक std::vector को बनाने में new char[] की तुलना में अधिक समय लगना चाहिए।

कहा जा रहा है, BM_RawInit और BM_VectorInit के बीच एक और अंतर है। जब आप एक पूर्णांक तर्क के साथ एक std::vector बनाते हैं, जैसा कि std::vector<char> a(MAX_PACKET_LENGTH) में होता है, तो दो चीजें होती हैं। ढेर पर MAX_PACKET_LENGTH आइटम और के लिए जगह आवंटित की जाएगी और वे आइटम भी डिफ़ॉल्ट रूप से बनाए जाएंगे। दूसरी ओर, जब आप new char[MAX_PACKET_LENGTH] करते हैं, तो केवल आवंटन होता है।

बेहतर तुलना के लिए, एक तीसरा बेंचमार्क बनाने का प्रयास करें जो केवल स्थान आवंटित करता है, जैसे:

static void BM_VectorReserve(benchmark::State &state)
{
    for (auto _ : state) 
    {
        std::vector<char> a;
        a.reserve(MAX_PACKET_LENGTH);
    }
}

हालांकि, यह एक पूर्ण तुलना नहीं है, क्योंकि पहली पंक्ति पर स्मृति की एक छोटी मात्रा आवंटित की जाएगी जहां हम a घोषित करते हैं, और फिर जब हम reserve को कॉल करते हैं, तो वह प्रारंभिक मेमोरी जारी की जाएगी। उसके बाद, std::vector, MAX_PACKET_LENGTH आइटम के लिए पर्याप्त जगह आवंटित करेगा। वास्तविक कोड में, यह अक्सर नगण्य होता है, लेकिन आपके बेंचमार्क के लिए, यह आंशिक रूप से समझाएगा कि BM_VectorReserve BM_RawInit से अधिक समय क्यों लेता है।

-1
Tim Johns 16 मई 2018, 20:54