جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
کنترل سرعت برنامه
-(3 Body) 
کنترل سرعت برنامه
Visitor 204
Category: دنياي فن آوري
در صحبت هاي قبل به سرعت برنامه ها و نقش برنامه نويس در آن اشاره کرديم و گفتيم يکي از مهم ترين عوامل در بهسازي سرعت برنامه، کاهش دستورات تکرار شونده است.
درون رايانه هر کاري که قرار است انجام شود نياز به زمان دارد. يک دستور if ساده حتي اگر شرط آن برقرار نباشد و کنترل برنامه به داخل بلاک if وارد نشود باز هم اگر اين کار به تعداد زياد انجام شود زمان گير خواهد بود. حال مي خواهيم ببينيم چه عوامل و نکات ديگري در سرعت برنامه موثر خواهد بود. الگوريتم مناسب شايد بتوان گفت مهم ترين و تاثيرگذارترين مساله در تعيين کارايي و سرعت يک برنامه، الگوريتم يا روش مورد استفاده در آن برنامه است. از ابتداي به وجود آمدن رايانه، برنامه نويسان و متخصصان درصدد طراحي الگوريتمي بوده اند که بتواند با صرف کمترين زمان، هزينه و انرژي آنها را به هدف برساند. ممکن است شخصي الگوريتمي طراحي کند که عمل بخصوصي را در مدت زمان مشخصي انجام دهد و شخص ديگري روشي ارائه دهد که بتواند همان کار را در زمان کمتري انجام دهد. مسلما برنامه اي با ارزش تر است که بتواند کاري را در کمترين زمان ممکن انجام دهد. به عنوان يک نمونه ساده فرض کنيد برنامه اي قرار است يک سري داده را از ورودي به طور تصادفي دريافت کرده و آنها را مرتب کرده و به خروجي تحويل دهد. تاکنون روش هاي زيادي براي اين کار مطرح شده است که هر يک به طريقي عمل مرتب سازي را انجام مي دهد. هر کدام از آنها نيز نسبت به ديگري معايب و مزايايي دارد که آن روش را نسبت به بقيه متفاوت مي سازد. يک برنامه نويس با توجه به نيازهاي خود و شرايط موجود بايد سعي کند بهترين روش را انتخاب کند و در صورتي که هيچ يک از روش هاي موجود پاسخگوي نياز وي نبود خود اقدام به طراحي الگوريتمي کند که بتواند به نيازها پاسخ دهد. هميشه يک الگوريتم نامناسب تنها موجب کندي اجرا نخواهد شد. گاهي اگر يک الگوريتم زمان معقولي براي پاسخ دهي نداشته باشد، استفاده از آن عملا غيرممکن خواهد بود. به عنوان يک مثال ساده، مساله اي به نام فروشنده دوره گرد (tsp) در علوم رايانه مطرح است که حل آن به روش معمول در مواردي ممکن است به هزار سال زمان نياز داشته باشد! اين بدان معني است که اين روش عملا قابل اجرا نيست. همين مساله با همان ابعاد با يک روش ديگر مي تواند در 5 دقيقه حل شود. ضمن اين که روش جديد نيز که مي تواند آن مساله را 5 دقيقه اي حل کند اگر ابعاد مساله را بزرگ تر کنيم آن هم ممکن است براي پاسخ دهي به سال ها زمان نياز داشته باشد. بنابر اين جدا از سرعت رايانه، به کارگيري يک الگوريتم مناسب در سرعت اجراي برنامه ها تاثير مستقيم خواهد داشت. استفاده مناسب از حافظه اصلي و فايل همان طور که مي دانيد سرعت عمل حافظه اصلي در مقايسه با حافظه جانبي بسيار بيشتر است. اما ظرفيت حافظه اصلي محدود بوده و قيمت آن نيز نسبت به ديسک سخت گران تر است. در نوشتن برنامه ها، برنامه نويس بايد به اين مساله توجه کافي داشته باشد که برنامه نوشته شده بايد حتي الامکان ميزان کمتري حافظه اصلي را اشغال کند. يکي از معيارهاي مهم در سنجش يک برنامه در کنار سرعت اجراي آن، ميزان حافظه مصرفي آن است. اما استفاده صحيح و مناسب از آن باعث بهبود کارايي و افزايش سرعت برنامه خواهد شد. داده هايي که مقيم حافظه شده اند و روال ها و توابع برنامه به طور مستقيم از حافظه اصلي به آنها دسترسي دارند با حداکثر سرعت پردازش خواهند شد. بنابراين اگر قرار است روي داده هايي که قرار است کار زيادي با آنها داريم و درون فايل قرار دارند پردازشي کنيم، در صورتي که حجم آنها زياد نيست بهتر است که فضايي را در حافظه اصلي براي آنها در نظر گرفته و آنها را به طريقي در آنجا مقيم کنيم و پس از اتمام پردازش روي آ نها، نتيجه را در فايل بازنويسي کنيم. البته اغلب امکان پردازش مستقيم داده ها از روي فايل نيز وجود دارد که در صورت استفاده از اين امکان حجم کمتري از حافظه اصلي اشغال خواهد شد. اما عمليات ورودي™خروجي (i/o) يعني خواندن و نوشتن مکرر از/ روي فايل زمان زيادي را از برنامه خواهد گرفت و ممکن است کارايي آن را بشدت کاهش دهد. هيچ قانوني براي استفاده از حافظه اصلي به جاي فايل يا بالعکس براي برنامه نويسان وجود ندارد که بخواهند طبق آن عمل کنند. هر برنامه نويس با توجه به دانش و تجربه نسبي که دارد بايد مناسب ترين روش را براي بهبود بازده برنامه خود اتخاذ کند. افزايش کارايي در ورودي/خروجي مسلم است که اگر برنامه با حافظه اصلي کار مي کند بيشترين سرعت ممکن را خواهد داشت. اما زماني که تصميم براين شد که پردازش داده ها به طور مستقيم از روي فايل انجام شود، در به کارگيري آن روش نيز بايد توجه لازم صورت گيرد. فرض کنيد يک فايل حجيم صد مگابايتي داريم که قرار است روي تک تک بايت هاي آن پردازشي صورت گيرد و مجددا در فايل نوشته شود. مسلما مقيم کردن صدمگابايت داده در حافظه منطقي نخواهد بود و روش پردازش فايل انتخاب خواهد شد. حال اولين چيزي که به نظر مي رسد آن است که داده ها را بايت به بايت از فايل خوانده و پس از پردازش مجددا به فايل برگردانيم. تجربه نشان داده است که اين کار، حتي اگر تنها خواندن و نوشتن باشد و هيچ پردازش زمان گيري روي داده انجام نشود، باز هم کارايي و سرعت عمل برنامه بشدت کم خواهد بود. عمليات ورودي– خروجي نسبت به کارهاي داخل cpu و حافظه اصلي از جمله کارهاي زمان گير به حساب مي آيد. حال اگر اين کار با فايلي با حجم گفته شده بخواهد به تعداد بايت هاي فايل انجام گيرد، افت شديد کارايي برنامه چيز عجيبي نخواهد بود. بنابر اين بهتر است با هر بار عمليات ورودي / خروجي و پس از مراجعه به ديسک، حجم بيشتري از فايل را فراخواني کنيم و پس از مقيم کردن آن مقدار در حافظه، باقي کار را با سرعت حافظه اصلي انجام دهيم. حال اين سوال مطرح مي شود که پس از هربار مراجعه به ديسک چه مقدار از داده را به حافظه منتقل کنيم. ممکن است براي اجراي يک برنامه آنقدر حافظه اصلي دراختيار داشته باشيم که برنامه نويس تصميم بگيرد پس از هر مراجعه به ديسک مثلا يک مگابايت از داده ها را به حافظه منتقل کند. اين کار دو اشکال مي تواند داشته باشد. اول اين که اين برنامه نظر ميزان از حافظه مصرفي، بهينه نخواهد بود و اگر قرار باشد برنامه در رايانه اي با حافظه کمتر اجرا شود، امکان مواجه شدن با کمبود حافظه و افت کارايي در آن وجود خواهد داشت. از طرف ديگر اگر نرم افزار ما يک برنامه محاوره اي باشد، کاربر در هنگام خوانده شدن هر يک مگابايت بايد مدتي صبر کند تا بتواند با ساير بخش هاي برنامه کار کند که اين مساله نيز يک ضعف براي نرم افزار به شمار مي رود. شايد بهترين حالت اين باشد که پس از هر بار مراجعه به ديسک به ميزان يک سکتور يا يک بلاک ديسک داده فراخواني شود. يک بلاک ديسک معمولا 4 يا 16 کيلوبايت است که البته کار برهنگام فرمت کردن ديسک مي تواند اين مقدار را تعيين کند. اما به طور عام اين مقدار در نظر گرفته مي شود. فراخواني يک بلاک داده در هر بار عمليات i/o چند مزيت دارد. يکي آن که کمترين ميزان حافظه براي بالا بردن کارايي برنامه مصرف مي شود. از اين مقدارکمتر حجم عمليات i/o اضافه مي شود و از اين بيشتر ممکن است بدون افزايش محسوس کارايي تنها حافظه بيشتري مصرف شود. مزيت ديگر آن است که هنگام فراخواني يک بلاک از ديسک، تضمين مي شود که هر ديسک وقتي به محل مورد نظر رسيد براي خواندن مقدار مورد نظر ديگر لازم نيست حرکت کند. چون يک بلاک داده در ديسک به صورت پشت سر هم نوشته مي شود. با توجه به اين که زمان گيرترين عمل در يک ديسک سخت، حرکت هد آن است، کارايي بهينه خواهد بود و البته باز هم نسبت به شرايط و محيط اجرا مي توان تدابير ديگري انديشيد که اين برعهده طراح نرم افزار و مخصوصا برنامه نويس خواهد بود.
منبع: www.jamejamonline.com
Add Comments
Name:
Email:
User Comments:
SecurityCode: Captcha ImageChange Image