PDA

View Full Version : فضای مورد نیاز برای اجرای برنامه



Marine
پنج شنبه 22 دی 1384, 18:17 عصر
درود

میخواستم بدونم چطور میشه حافظه مورد نیاز برای اجرا شدن برناممون رو بدست بیاریم
ایا برنامه ای هست یا چیز دیگه ای ... ؟


ممنون

Inprise
پنج شنبه 22 دی 1384, 23:23 عصر
یک پروسه پس از اجرا ، روی حافظه تحت تاثیر عوامل مختلفی قرار میگیره که باعث میشه حتی در شرایط یکسان میزان حافظه ای که بهش اختصاص داده شده متفاوت باشه ، مثلا" اولویت اجرای Thread های برنامه و اولویت اجرای سایر ریسمانهای سایر نرم افزارها ، Alignment هنگام کامپایل و Alignment سایر برنامه های در حال اجرا ، وضعیت سیستم از لحاظ فشار روی حافظه و ترافیک Paging و ...عواملی مثل این ، و بطور خلاصه سایز نسخهء در حال اجرای یک برنامه ، به هیچ عنوان عدد ثابت و مشخصی نیست ، و نمیتونه که باشه . اما پس از یک اجرای کامل ، و تست برنامه در حالتهای مختلف ، به کمک قسمت Peak mem Usage از Task Manager میتونی به تقریب مناسبی حداکثر حافظه مجازی اختصاص داده شده به برنامه در طول اجرا رو بدست بیاری .

Marine
جمعه 23 دی 1384, 09:57 صبح
ممنون

mem usage رو خودم میدونستم ، دنبال راه مناسبتری میگشتم
برای مثال بازیهای کامپیوتری چطور حافظه مورد نیاز برای بازی رو محاسبه میکنن ؟

seyedof
جمعه 23 دی 1384, 11:40 صبح
سلام
عملگر new رو در برنامه خودتون override کنید. اینطوری میتونید کلیه حافظه هایی که بصورت دینامیک در برنامه شما تخصیص داده میشه حساب کنید. یک مقدارش رو هم قبل از ایجاد هرگونه اشاره گر ، توسط توابع API ویندوز محاسبه کنید. این محاسبات کاملا تقریبی است و بازیها هم هیچوقت به طور دقیق نمیگویند که چقدر حافظه میخواد. مثلا شما اگر با محاسبات فوق به عدد 152 مگابایت رسیدید میتونید تقریبا با دقت قابل قبولی بگین که برنامه شما 170 مگابایت حافظه نیاز داره.
سعی کنید همواره از اشاره گرها و تخصیص دینامیک استفاده کنید.
ممنون علی

Inprise
جمعه 23 دی 1384, 12:12 عصر
میزان حداقل حافظه مورد نیاز برنامه هائی مثل بازی ها کاملا" تجربی و بر اساس بررسی بازی و علم توسعه گرانش به جزئیات طراحی اش هست و همانطور که گفتم روشی برای محاسبه دقیق یا حتی تقریبی حافظه مورد نیاز یک برنامه وجود نداره ، چون این مقدار وابسته به شرایط متفاوتی است که در زمان اجرا ، وجود دارند و نمیشه اونها رو پیش بینی کرد .

seyedof
جمعه 23 دی 1384, 17:17 عصر
سلام
ولی فکر کنم بشه سقفی براش تعیین کرد اوونقدر ها هم بدون حساب و کتاب نیست. درسته که به خیلی شرایط بستگی داره و به طور دقیق نمیشه محاسبه بشه ولی به طور تقریبی میشه.
ممنون علی

Inprise
جمعه 23 دی 1384, 18:32 عصر
اتفاقا" به همین دلیل که با حساب و کتابه نه دقیق و نه تقریبی نمیشه اندازه ای رو تضمین کرد ؛ حتی اگر با انواع محاسبات ، بتونی تخمین بزنی حجم برنامه ات روی حافظه الف مگا بایت خواهد شد ، میتونم برنامه مذکور رو با اولویت فوق العاده بالا و روی سیستمی در حال پردازش سنگین طوری اجرا کنم که الف به توان 2 مگابایت حافظه بهش تخصیص داده بشه ( یکی از دلائل متداول همینه ، عموما" وقتی تراکنشهای حافظه خیلی بالاست سعی میکنه پردازشهای با اولویت بالا رو توسط حافظه اصلی و پردازشهای با اولویت پائین تر رو با حافظه مجازی مدیریت کنه ، و این شرایط باعث میشه کامپوننتهای کرنل رو بجای محدودهء یک گیگا بایتی ابتدای بازه آدرس ، به فضای خود پروسه اینجکت کنه ، که این باعث بالا رفتن شدید سایز نسخهء در حال اجرای برنامه میشه ؛ این تازه یک سناریو بود ، شخصا" موارد دیگری رو هم دیدم که با توجیهات کاملا" فنی ، مدیر حافظه رفتاری غیر قابل پیش بینی از خودش نشون میده ، اما اگر قرار باشه خیلی آکادمیک و در حالت ایده آل و یک برنامه عادی بدون پیچیدگی رو در نظر بگیریم و محیط اجرا دارای هیچ حالت خاص یا ترافیک بالا و ...-سایر موارد ذکر شده - نباشه ، میشه یه تخمینهائی زد ، لیکن واضحه که در کل این حدسها چندان قابل اتکاء نیستند )

Marine
شنبه 24 دی 1384, 15:12 عصر
عملگر new رو در برنامه خودتون override کنید. اینطوری میتونید کلیه حافظه هایی که بصورت دینامیک در برنامه شما تخصیص داده میشه حساب کنید


متوجه نشدم ؛
override کنم ؟ . یعنی چی ؟



سعی کنید همواره از اشاره گرها و تخصیص دینامیک استفاده کنید

استفاده از تخصیص دینامیک چه اثری توی محاسبه میزان حافظه داره ؟!

seyedof
یک شنبه 25 دی 1384, 07:10 صبح
سلام
بله میشه عملگر new و delete رو دوباره تعریف کرد و اینطور حساب کتاب اینکه چقدر حافظه تخصیص یافته و چقدر آزاد شده قابل محاسبه است. یه خوبی دیگه اینکار اینه که شما میتونید یک log از عملیات حافظه ای برنامه خودتون داشته باشید و اگر در انتهای برنامه حافظه ای تخصیص داده شده بود ولی آزاد نشده بود خیلی راحت معلوم میشه. برای جلوگیری از memory leakage بسیار روش مناسبیه مخصوصا در برنامه های حجیم و پیچیده که در صورت داشتن leakage پیدا کردنش واقعا سخته.

تخصیص دینامیک برنامه شما تشکیل میشه از یک هسته بسیار کم حجم اصلی و در واقع بقیه کلاسها و اطلاعات شما همه پویا هستند. تخصیص داده های استاتیک دست شما نیست و بنابراین کنترل کمتری روی اون دارید در عوض در تخصیص دینامیک تخصیص حافظه و آزاد کردن اوون دست شماست. ضمن اینکه تخصیص دینامیک به استفاده بهینه از حافظه کمک میکنه و داده ها و کلاسهای مورد نیاز ایجاد و در زمان عدم نیاز حذف میشوند.

ممنون علی

Anti_Evil
یک شنبه 25 دی 1384, 19:59 عصر
با سلام،

پست های دوستان عزیزم در مورد محاسبه حافظه، محتوی اطلاعات کاملا ارزشمندی هست ...

در مورد override کردن new/delete منظور آقای seyedof دقیقا override کردن این دو در کلاس مورد نظرت هست ... برای این منظور شما می بایست با مفاهیم Class کاملا آشنا باشی، توصیه می کنم به بخش مربوط به Class Operators تو Refrence خودت نگاه کنی ...

با تشکر،
هادی = Memory Leaker !!!