سؤال

أقوم بتخزين بعض الفصول مع معلمات العرض التي تصفها (مثل الاسم والوصف وبعضها الآخر). الآن إذا قمت بتغيير كل تلك widestrings إلى "سلسلة" بسيطة (أنا أستخدم الاسم المستعار فعليًا ، لذلك يجب أن أقوم بتغيير سطر واحد فقط) ، يكون استخدام الذاكرة أكبر بحوالي 5 ٪ !! من السابق ... كيف يكون ذلك ممكنًا ، لأن كل شار من السلسلة أصغر مرتين من Widechar؟

شكرا لك مقدما!

م.

هل كانت مفيدة؟

المحلول

لا يقوم Delphi Memory Manager بإصدار جميع الذاكرة غير المستخدمة إلى نظام التشغيل. يمكن أن يركل التفتت بشكل سيء للغاية. يعتمد كلاهما على مدير الذاكرة الفعلي الذي تستخدمه (عادةً ما يكون FastMM أفضل من مدير ذاكرة الأسهم في D7 ، ولكن يمكن إحضار أي مدير ذاكرة إلى ركبتيه باستخدام سلسلة محددة من أنماط استخدام الذاكرة). علاوة على ذلك ، فإن WideStrings ، على الرغم من أنها سلاسل COM ، لا يتم إحضارها ، وقد لا يتم إصدارها حتى في وقت متأخر من الأوتار الطبيعية.

الطريقة الوحيدة الموثوقة للاستعلام عن رسالة الذاكرة الفعلية في دلفي هي أن تسأل مدير الذاكرة الذي يستخدمه برنامج Delphi الخاص بك. هذه الوظيفة في وحدة النظام تفعل ذلك من أجلك:

function GetHeapStatus: THeapStatus

-جيرون

تحرير: 20100104 ردا على التعليق من قبل ماركو: (عادة ما يكون FastMM أفضل من مدير ذاكرة الأسهم في D7 ، ولكن يمكن إحضار أي مدير ذاكرة إلى ركبتيه باستخدام سلسلة محددة من أنماط استخدام الذاكرة مدير الذاكرة)

نصائح أخرى

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

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

تستخدم WideStrings مدير ذاكرة مختلف (A Windows One) ثم Ansistrings (Delphi's) ويتم حساب المرجع مختلفًا. كيف قياس استخدام الذاكرة؟ مع أي أداة وما هو العداد الدقيق؟

كيف يمكنك قياس المذكرات المستخدمة؟ يتم تخصيص ذاكرة WIRC WideString باستخدام SysallOcString () وبالتالي تجاوز مدير ذاكرة Delphi.

يأخذ مدير الذاكرة في دلفي دائمًا ذاكرة أكثر مما يحتاجه حقًا. هذا هو تحسين السرعة.

هل تستخدم نوع Ansistring أو ShortString عند عدم استخدام WideString؟ هل من الممكن أن تقوم بتجميع علامة برنامج التحويل البرمجي {$ H -} (إما على مستوى العالم أو في بعض الوحدات) التي تعامل جميع أنواع "السلسلة" على أنها قصيرة؟ إذا كانت سلاسلك من نوع قصير من نوعها ولم تحدد حجم السلسلة ، فإن الذاكرة المخصصة هي دائمًا 256 بايت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top