0

بهبود کارايي يك الگوريتم

 
samsam
samsam
کاربر طلایی1
تاریخ عضویت : بهمن 1387 
تعداد پست ها : 50672
محل سکونت : یزد

بهبود کارايي يك الگوريتم

 
هر کامپيوتر براي اجراي يک قطعه برنامه نياز به گرفتن مقداري منابع دارد، اين منابع شامل حافظه مصرفي براي تعريف متغير‌ها و زمان پردازش آن قطعه کد است.

اين را بايد هميشه در نظر گرفت که اجراي بهينه و کاراي يک قطعه‌کد يا يک الگوريتم در مصرف بهينه‌ منابع کامپيوتر نقش مهمي دارد.

براي مثال اگر دقيق بدانيم به چه مقدار فضا براي ذخيره يک داده مشخص نياز داريم و بر پايه آن نوع متغير مورد نياز خود را تعريف کنيم يا اين‌كه يکسري دستورات چندبار بايد اجرا شوند و اين دستورات چه مقدار زمان پردازشگر را مي‌گيرند، در به‌كارگيري بهينه پردازشگر نقش خواهد داشت.

به‌‌رغم اين‌که يکسري کليات بايد براي طراحي و پياده‌سازي الگوريتم لحاظ شود، اما هر مساله براي خود شرايط خاصي دارد، اما در نظر گرفتن برخي موارد به کارايي بهتر الگوريتم و قطعه کد ما کمک مي‌کند. برخي از اين موارد بدين شرح‌اند:

1- حذف بخش‌هاي اضافه در کد

گاه برخي از دستورات به‌صورت ثابت چندين بار پشت سر هم اجرا مي‌شوند، اين امر بيشتردر قطعه‌کد مربوط به حلقه‌ها ديده مي‌شود.

براي نمونه، يک دستور ثابت هميشه در يک بار اجراي حلقه محاسبه مي‌شود، مي‌توان با بيرون آوردن اين دستورات به خارج از حلقه و اجراي آنها در آنجا به اجراي بهينه يک حلقه کمک کرد و از زمان پرتي که براي محاسبه اين دستور يا دستورات در هر بار اجراي حلقه صرف مي‌شود، جلوگيري کرد.

به‌طور مثال قطعه کد زير را در نظر بگيريد:

for (int i = 0; i « length; i++) {

x += 1.0;

y = (a*a*a)*x*x + b*b*i;

}

محاسبه a به توان 3 و b به توان 2يهوده است چون هميشه يک مقدار ثابت دارند ولي در هر بار اجراي حلقه محاسبه مي‌شوند.

راه حل اين است که اين مقادير يک بار بيرون حلقه اجرا شوند و در دفعات بعد از حاصل اين عبارت درون حلقه استفاده شود. اين امر سبب مي‌شود که سرعت و زمان اجراي دستورات درون حلقه نسبت به حالت اول بهتر شود.

بهينه شده کد بالا به‌صورت زير است:

power3a = a*a*a;

power2b = b*b;

for (int i = 0; i « length; i++) {

x += 1.0;

y = power3a*x*x + power2b*i;

}

2 ارجعات به عناصر آرايه

اگر هنگام کدنويسي دقت لازم را نداشته باشيم اين محاسبات اضافه که در بالا توضيح داده شد، به پردازش عناصر يک آرايه نيز سرايت مي‌کند و باعث كندي اجراي قطعه کد ما و اتلاف زمان پردازشگر شود.

براي مثال قطعه کد زير را در نظر بگيريد

p = 0;

for (int i = 0; i « length; i++) {

if (a[i] » a[p])

p = i;

max = a[p];

}

در قطعه کد بالا قطعه فرمان [max = a[p بي‌دليل در هر بار اجراي حلقه، محاسبه مي‌شود که نيازي به اين کار نيست. تنها کافيست وقتي که عنصر iم از عنصر pم کوچک‌تر بود، اجرا شود. حالا قطعه کد بالا را بازنويسي مي‌کنيم:

p = 0;

for (int i = 0; i « length; i++) {

if (a[i] » a[p]) {

p = i;

max = a[p];

}

}

3- عدم کارايي در نتيجه ديرکرد

گاهي پايين بودن کارايي يک قطعه کد به لحاظ آزمون‌‌هاي غيرضروري است. بگزاريد اين موضوع را با يک مثال نشان دهيم:

فرض کنيد دنبال دانشجوياني با اسم “آرش” مي‌گرديم، يک راه اين است که “آرش” را با نام همه دانشجويان مقايسه کنيم و کساني که اسم آنها “آرش” است را در يک ليست ذخيره کنيم، اين راه درست است و مشکلي ندارد ولي آيا اين راه يک راه بهينه براي حل مساله است؟

پاسخ خير است، چون در بدترين حالت نام‌هاي “آرش” در انتهاي ليست هستند و براي يافتن فهرست آنها نيازمند پردازش کل آرايه تا انتها است. اما راه‌حل براي بهبود کارايي روش بالا چيست؟

بهتر است ابتدا دانشجويان را بر اساس اسامي مرتب بکنيم و سپس دنبال دانشجوياني که اسم آنها “آرش” است بگرديم و اگر نامي بزرگ‌تر از “آرش” بود (مانند “آرشين”) از آنجا به‌بعد را مورد بررسي قرار نمي‌دهيم و همان‌جا پايان کار ماست. درست است ما يک زمان اضافي براي مرتب‌سازي آرايه‌ها صرف کرديم ولي در دفعات بعد براي داده‌هاي ديگر نيازي به اين عمل نيست چون فقط يک بار داده‌ها مرتب مي‌شوند و در دفعات بعدي از نتيجه مرتب‌سازي استفاده مي‌شود.

يک مثال ديگر از اين عدم کارايي بعضي از پياده‌سازي‌هاي الگوريتم مرتب‌سازي حبابي (Bubble sort)است.

for i = 1 to n-1

for j = 1 to n-1

if (a[j] » a[j+1])

exchange a[j] with a[j+1];

بهتر است به‌جاي شبه کد بالا از شبه کد زير استفاده کرد:

for i = 1 to n-1

for j = 1 to n-i

if (a[j] » a[j+1])

exchange a[j] with a[j+1]

به‌عنوان تمرين بهتر است سري به کد‌هاي قديمي نوشته خود بزنيد و آنها را بررسي کنيد و موراد بالا را لحاظ کنيد و کارائي آنها را بيازماييد.

امير بهاالدين سبط‌الشيخ

چهار راه برای رسیدن به آرامش:
1.نگاه کردن به عقب و تشکر از خدا  2.نگاه کردن به جلو و اعتماد به خدا  3.نگاه کردن به اطراف و خدمت به خدا  4.نگاه کردن به درون و پیدا کردن خدا

پل ارتباطی : samsamdragon@gmail.com

تالارهای تحت مدیریت :

مطالب عمومی کامپیوتراخبار و تکنولوژی های جدیدسیستم های عاملنرم افزارسخت افزارشبکه

 

جمعه 30 مهر 1389  9:02 AM
تشکرات از این پست
mehdi0014
دسترسی سریع به انجمن ها