ناقلات نظيفة كل حلقة التكرار. ما هي الطريقة الأكثر كفاءة الذاكرة؟
-
03-07-2019 - |
سؤال
ولدي سؤال حول الأمراض المنقولة جنسيا :: ناقلات.
ولدي ذاكرة خوارزمية مكثفة جدا حيث أنا فورسي أن توقع أحجام ناقلات وحجز ذاكرة كافية لناقلات مقدما سيساعدني كثيرا مع تقليل استخدام الذاكرة.
وأي مما يلي هو الأفضل:
for ( ... ) {
std::vector<Type> my_vector;
my_vector.reserve(stuff_count);
// Do stuff , and append stuff to my_vector.
}
وأو هذا:
std::vector my_vector;
for ( ... ) {
my_vector.clear();
my_vector.reserve(stuff_count);
// Do stuff , and append stuff to my_vector.
}
ومن فضلك قل لي ما هو أفضل، أو إذا كان هناك طريقة أفضل للقيام الاشياء.
وشكرا جزيلا مقدما!
المحلول
ومع الخيار الأول يمكنك تخصيص المخزن المؤقت للناقلات على كل التكرار - وهذا عادة مكلفة للغاية. مع البديل الثاني الذي تخصيص إلا لماما. الخيار الثاني هو الأفضل منذ السرعة هي أولوية بالنسبة لك.
وليس من الواضح من سؤالك حيث عدد العناصر هو أعلم منه. ربما كنت حتى يمكن حساب بسرعة أكبر عدد ممكن من العناصر لجميع التكرارات، تعيين هذا إلى أن يكون حجم المخزن المؤقت وليس لها أي تخصيص.
نصائح أخرى
وأنا فورسي أن توقع أحجام ناقلات وحجز ذاكرة كافية لناقلات مقدما سيساعدني كثيرا مع تقليل استخدام الذاكرة.
اقتباس فقرة>وحاول وتتصرف مثل مهندس لا عراف. إنشاء اختبار، وقياس الفرق.
وثانية واحدة يمكن أن يكون أسرع قليلا، ولكن أجد أول واحد أكثر نظافة.
وأما الاختلافات في رمز تافهة، لماذا لا يختبر كلا النهجين ومعرفة الأفضل للتطبيق الخاص بك معين؟
وذلك يعتمد قليلا على كيفية النوع يحتاج إلى بناء / دمرت، وأود أن أقول. إذا كان هو POD التي لا تتطلب تدمير، يمكنك تخطي واضحة ()، الذي يدعو جميع تالفة في حلقة، واستخدامه بمثابة مجموعة ثابتة بدلا من ذلك:
std::vector<Type> my_vector(size);
for (...)
{
int index = 0;
// Do stuff
my_vector[index] = some_value;
}
و(تحذير: كود مجربة)
... حجز ذاكرة كافية ل سوف ناقلات مقدما يساعدني كثيرا مع الحد من استخدام الذاكرة
اقتباس فقرة>ويخطئ ... ماذا ؟! أن لا معنى له على الإطلاق. حجز الذاكرة لا يساعد مع تقليل استخدام الذاكرة بأي شكل من الأشكال. ويمنع الحاجة إلى إعادة تخصيص المستمر الذي يجعل الأمور أسرع، ولكن بقدر الاستخدام م> يذهب تحصل أي فائدة.
وثانية واحدة واستخدام الذاكرة القصوى من جميع استخدامات أنه خلال الحلقة، أي الحد الأقصى لحجم أنواع stuff_count. std::vector::clear()
لا يعني بالضرورة الذاكرة مجانا . أي في حالة استدعاء std::vector::capacity()
قبل وبعد std::vector::clear()
مستوى تنفيذ المطابقة يمكن إرجاع نفس القيمة.
وفي أحسن الأحوال، سوف يمكنك تقليل عدد المرات التي تخصيص الذاكرة مع مخطط أعلاه. ولكنك بالتأكيد لن يكون تقليل أثر الذاكرة في أي لحظة. إذا كنت تريد أن يتقلص لكمية المحجوزة من الذاكرة، يجب عليك استخدام لغة ناقلات مبادلة:
std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count);
وأو الحل الأول، منذ التأثير الكلي سوف تكون هي نفسها.
إذا كنت بحاجة إلى القيام بالكثير من إلحاقها استخدام STD :: صف مزدوج الذيل بدلا من الأمراض المنقولة جنسيا :: ناقلات ومجرد استخدام "push_back".
وماذا عن؟
std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));