PDA

View Full Version : حرفه ای: حداقل رسانی اشغال حافظه رم توسط برنامه در زمان اجرا



arash020
پنج شنبه 27 آبان 1389, 09:46 صبح
دوستان سلام

شاید برای شما هم پیش اومده باشه که یه برنامه ی کوچیک به زبان vb 6 نوشتین که جمعا 1 مگ هم نشده ,
ولی موقع اجرا توی taskmanager که میبینید حدود 10 مگابایت فضای رم رو اشغال کرده !!!

از طرفی فوتوشاپ هم اجراست؛ با کمال تعجب مشاهده میشود که این قول گرافیست فقط 14 مگ رو گرفته اند...!!!

حالا سوال من اینه که اصلا ملاک برای اینکه یه برنامه چقدر به رم نیاز داره چیه و
چطور میشه این مقدار رو به حداقل رسوند؟؟؟؟!!!!

با تشکر

M.T.P
پنج شنبه 27 آبان 1389, 10:42 صبح
اصولا تمامی متغیرهایی که بصورت Public توی ماژول و یا بعنوان یک کلاس تعریف کردین تا زمانی که برنامه شما در حال اجراست جاشون توی رم هست و به هر میزان که بهشون دیتا نسبت داده بشه از رم شما فضا اشغال خواهد کرد.
برای تست این موضوع یک متغیر رو از نوع Adodb.Recordset در ماژول بصورت Public تعریف کنید و یک جدول بانک رو با یک حجم مشخص باهاش Open کنید و همزمان فضای اشغال شده رم رو یه نگاه بندازید. تا رمانی که رکوردست بسته نشده این فضا از رم آزاد نخواهد شد. همچنین اگه این رکوردست اطلاعاتش رو تو یه DataGrid بریزه فضایی برابر با حجم رکوردست به اطلاعات درون Datagrid اختصاص داده خواهد شد.

arash020
دوشنبه 01 آذر 1389, 12:40 عصر
اگه به جای متغیر های string از لیبل و textbox استفاده بشه چی؟

Felony
دوشنبه 01 آذر 1389, 13:10 عصر
اگه به جای متغیر های string از لیبل و textbox استفاده بشه چی؟
اونها هم شئ هستند و در حافظه براشون فضا در نظر گرفته میشه .

vbhamed
دوشنبه 01 آذر 1389, 14:49 عصر
سلام

براي اين كار بايد تا جاي ممكن متغيرهاي استفاده شده مخصوصا آرايه ها، ركوردست ها و غيره را پس از استفاده آزاد كرد
مثلا آرايه رو به صورت دايناميك تعريف كنيم تا بعدا بتونيم فضاي مصرفي رو آزادش كنيم

يك مثال

dim A() As Integer

Redim A(100000) As Integer

.
.
Use of array here
.
.

Redim A(0) As Integer

تو مثال بالا ابتدا آرايه دايناميك تشكيل شده سپس حافظه صد هزار عنصر تخصيص داده ميشه و بعد حافظه آزاد ميشه

ضمنا برنامه هاي بزرگ معمولا به قسمتهاي كوچكتر تقسيم مي شن و هر قسمت به صورت يك كتابخانه يا DLL نوشته ميشه و در مواقع نياز بارگذاري ميشه، اينطوري فضاي حافظه خيلي كمتر مصرف ميشه و قابليت ارتقاء و آپديت نرم افزار هم بالا مي ره

xxxxx_xxxxx
سه شنبه 02 آذر 1389, 01:06 صبح
تا جایی که میتونید ماژول هایی با توابع و متغیرهای Public کمتر داشته باشید. (در صورت نیاز Public باشن)، چون محتوای کل ماژول های برنامه بلافاصله بعد از اجرای برنامه در حافظه بارگذاری میشن. کلاس ها از این قاعده مستثنا هستند، تا زمانی که یک Object از کلاس ها توی برنامه تون ایجاد نکنید حافظه ای بهشون تخصیص داده نمیشه.

اگر فایلی باز میکنید، اگر Recordset ای باز میکنید، حتماً بعد از استفاده تون بلافاصله اونها رو Close کنید.

حلقه های طولانی و تو در تو رو تا جایی که میتونید کاهش بدید، الگوریتم های برنامه تون رو بهینه سازی کنید.

بیخودی منابع حافظه رو اشغال نکنید (متغیرهای و Object های اضافی و بلااستفاده)

متغیرها رو قبل از استفاده تعریف کنید. ( به حضور Option Explicit عادت کنید)


اگه به جای متغیر های string از لیبل و textbox استفاده بشه چی؟ دیگه بدتر! یک متغیر String در بدترین حالت فقط 255 بایت حافظه اشغال میکنه که در مقابل فضای استفاده Label و TextBox ناچیز هست. اتفاقاً بجای TextBox ها و Label های غیر ضروری برنامه از متغیر استفاده کنید.

در استفاده از منابعی که در اختیارتون هست، صرفه جویی کنید (خاصیت Tag در بسیاری از اشیاء میتونه به عنوان یک متغیر Public استفاده بشه)

تا جایی که میتونید اشیائ توی فرم هاتون رو کاهش بدید. (اشیاء اضافی رو حذف کنید)

از هر ocx ای که دم دستتون رسید استفاده نکنید. ممکن هست اون ocx بد طراحی شده باشه و خودش حافظه زیادی رو به هدر بده.