تحسين استخدام ذاكرة برنامج دلفي الخاص بك

عند كتابة تطبيقات طويلة الأمد - فإن نوع البرامج التي ستقضي معظم اليوم يتم تصغيرها إلى شريط المهام أو علبة النظام، قد يصبح من المهم عدم ترك البرنامج "يهرب" من استخدام الذاكرة.

يشير العمودين أقصى اليمين إلى استخدام CPU (الوقت) واستخدام الذاكرة. إذا أثرت إحدى العمليات بشدة على أيٍّ من هذه العمليات ، فسيتباطأ نظامك.

نوع الشيء الذي يؤثر بشكل متكرر على استخدام وحدة المعالجة المركزية (CPU) هو برنامج يتم تشغيله (اطلب من أي مبرمج نسي وضع عبارة "قراءة التالي" في حلقة معالجة الملفات). عادة ما يتم تصحيح هذه الأنواع من المشاكل بسهولة.

استخدام الذاكرة ، من ناحية أخرى ، ليس دائمًا واضحًا ويجب إدارته أكثر من تصحيحه. افترض على سبيل المثال أن برنامج نوع الالتقاط قيد التشغيل.

يستخدم هذا البرنامج على مدار اليوم ، وربما لالتقاط الهاتف في مكتب المساعدة ، أو لسبب آخر. ليس من المنطقي إغلاقها كل عشرين دقيقة ثم تشغيلها مرة أخرى. سيتم استخدامه على مدار اليوم ، على الرغم من فترات زمنية غير متكررة.

إذا كان هذا البرنامج يعتمد على بعض عمليات المعالجة الداخلية الثقيلة أو كان لديه الكثير من الأعمال الفنية على أشكاله ، فسرعًا أو آجلاً

instagram viewer
استخدام الذاكرة سوف تنمو ، مما يترك ذاكرة أقل لعمليات أخرى أكثر تكرارا ، مما يدفع إلى زيادة نشاط الترحيل ، وفي النهاية يبطئ الكمبيوتر.

لنفترض أنك ستقوم بتصميم برنامج بالنموذج الرئيسي ونموذجين (مشروطين) إضافيين. عادةً ، وفقًا لإصدار دلفي الخاص بك ، ستقوم دلفي بإدراج النماذج في وحدة المشروع (ملف DPR) وسيشمل خطًا لإنشاء جميع النماذج عند بدء تشغيل التطبيق (التطبيق. CreateForm (...)

الخطوط المتضمنة في وحدة المشروع هي حسب تصميم دلفي وهي رائعة للأشخاص الذين ليسوا على دراية بدلفي أو الذين بدأوا للتو في استخدامها. انها مريحة ومفيدة. هذا يعني أيضًا أنه سيتم إنشاء جميع النماذج عند بدء تشغيل البرنامج وليس عند الحاجة إليها.

بناءً على ما يتعلق بمشروعك والوظائف التي طبقتها ، يمكن أن تستخدم الكثير من الذاكرة ، لذلك يجب إنشاء النماذج (أو بشكل عام: الكائنات) فقط عند الحاجة وتدميرها (تحريرها) بمجرد توقفها ضروري.

يجب حذف كل من "DialogForm" و "OccasionalForm" من قائمة "إنشاء النماذج تلقائيًا" ونقلها إلى قائمة "النماذج المتاحة".

يرجى ملاحظة أن الاستراتيجية الموضحة هنا تستند إلى افتراض أن البرنامج المعني عبارة عن برنامج "التقاط" في الوقت الفعلي. ومع ذلك ، يمكن تكييفها بسهولة لعمليات نوع الدُفعات.

دلفي لقد حاول تقليل هذا ولديه هندسة إدارة الذاكرة الخاصة به والتي تستخدم كتل أصغر بكثير ولكن هذا غير مجدية تقريبًا في بيئة Windows لأن تخصيص الذاكرة يقع في النهاية على نظام التشغيل.

بمجرد قيام Windows بتخصيص كتلة من الذاكرة لعملية ، وتحرر هذه العملية 99.9٪ من الذاكرة ، سيظل Windows يرى أن الكتلة بأكملها قيد الاستخدام ، حتى إذا كان هناك بالفعل بايت واحد فقط من الكتلة قيد الاستخدام مستخدم. والخبر السار هو أن Windows يوفر آلية لتنظيف هذه المشكلة. يوفر لنا الغلاف واجهة برمجة تطبيقات تسمى SetProcessWorkingSetSize. إليك التوقيع:

حسب التعريف ، تقوم الدالة SetProcessWorkingSetSize بتعيين الحد الأدنى والحد الأقصى لأحجام مجموعة العمل للعملية المحددة.

الغرض من واجهة برمجة التطبيقات هذه هو السماح بإعداد مستوى منخفض للحد الأدنى والحد الأقصى للذاكرة لمساحة استخدام الذاكرة في العملية. ومع ذلك ، فإنه يحتوي على القليل من المراوغة التي هي الأكثر حظا.

إذا تم تعيين كل من الحد الأدنى والحد الأقصى للقيم على FFFFFFFF $ ، فسيقوم واجهة برمجة التطبيقات (API) بتقليص حجم المجموعة مؤقتًا إلى 0 ، مع تبديله خارج الذاكرة ، وفوراً الارتداد مرة أخرى إلى ذاكرة الوصول العشوائي (RAM) ، سيكون به الحد الأدنى من مساحة الذاكرة المخصصة له (كل هذا يحدث في غضون بضع نانوثانية ، لذلك للمستخدم يجب أن يكون دقيق إلى حد بعيد).

سيتم إجراء مكالمة إلى واجهة برمجة التطبيقات هذه فقط على فترات زمنية محددة - وليس بشكل مستمر ، لذلك يجب ألا يكون هناك أي تأثير على الأداء.

الآن ، تحقق دوريًا من آخر علامة التجزئة مقابل "Now" وإذا كان الفرق بين الاثنين أكبر من الفترة التي تُعتبر فترة خمول آمنة ، فقم بقص الذاكرة.

قرر الآن بعد أي فترة من الوقت ستعتبر البرنامج خاملاً. قررنا دقيقتين في حالتي ، لكن يمكنك اختيار أي فترة تريدها وفقًا للظروف.

تكييف هذه الطريقة لأوقات المعالجة الطويلة أو عمليات الدُفعات بسيطة للغاية. عادةً سيكون لديك فكرة جيدة عن المكان الذي ستبدأ فيه العملية المطولة (على سبيل المثال بداية حلقة قراءة عبر ملايين سجلات قاعدة البيانات) وأين ستنتهي (نهاية حلقة قراءة قاعدة البيانات).

قم ببساطة بتعطيل المؤقت الخاص بك في بداية العملية ، وتمكينه مرة أخرى في نهاية العملية.