کلیدستان

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

در اینگونه موارد شخص به دنبال یافتن یک کامپیوتر مخصوص پردازش های سنگین که گران قیمت است و معمولا در دانشگاه ها یافت می شود ، می رود . که البته این کامپیوتر را دانشگاه در اختیار هر کسی قرار نخواهد داد .

اما نکته مهمی وجود دارد و آن این است که گاهی می توان با بهینه کردن کدهای برنامه متلب نوشته شده ، زمان اجرای آن را تا حد زیادی کاهش داد . در اینجا سعی می کنیم برخی از نکات مهم برای بهینه سازی کدهای متلب از نظر زمان اجرای آنها را بیان کنیم .

یکی از مهم ترین نکات ، عدم استفاده از حلقه های for می باشد . تا جایی که می توانید از حلقه های for در برنامه متلب خود استفاده نکنید . احتمالا ممکن است فکر کنید آن بخشی از برنامه متلب شما که دارای حلقه for است بدون این حلقه و به روش دیگری قابل نوشتن نخواهد بود اما باید بدانید که نرم افزار متلب دارای دستورات بسیاری است و مطمئنا اگر با حوصله در میان دستورات مختلف آن و نحوه استفاده از آنها جستجو کنید ، احتمال اینکه جایگزینی برای حلقه های for برنامه خود بیابید زیاد است .

لطفا روش هایی را که برای سریع تر کردن اجرای کدهای متلب یاد گرفته اید را در اینجا ذکر کنید تا مورد استفاده دیگران نیز قرار گیرد .
فرض کنید قرار است در حین اجرای برنامه ، مارتیسی به نام A با اندازه نهایی 1000 در 1000 ساخته بشه . به این صورت که به مرور و در حین اجرای برنامه ، مقادیر آن به مرور ساخته خواهد شد . یعنی مثلا ممکنه ابتدا 100 عضو داشته باشه ، بعد بشه 200 عضو ، بعد بشه 300 عضو و همین طور در برنامه ، اندازه آن افزایش یابد تا به اندازه نهایی 1000 در 1000 برسد .
نکته مهم در اینجا این است که نرم افزار متلب باید به طور متوالی اندازه ماتریس را تغییر دهد و نوشتن و پاک کردن ها و پردازش های اضافه زیادی رو باید انجام بده که باعث اتلاف زمان میشه .
راه حل این است که چون از ابتدا می دانیم اندازه نهایی ماتریس A به صورت 1000 در 1000 خواهد بود ، بنابراین در همان ابتدای برنامه ، با دستور zeros ، ماتریس A را به صورت یک ماتریس با ابعاد 1000 در 1000 که تمامی عناصر ان صفر هستند تعریف کنیم تا سپس در هنگام اجرای برنامه ، تنها مقادیر آن مشخص شود . کد به صورت زیر خواهد بود :

کد:
A=zeros(1000,1000);

این کار در عدم اتلاف وقت ، بسیار مفید خواهد بود .
در کامپیوترهایی که دارای cpu چند هسته ای هستند، می توان از پردازش موازی برای سریعتر اجرا شدن کدهای برنامه استفاده نمود. برای این منظور، کلید زیر را بخوانید :

http://www.kelidestan.com/keys/keys.php?key=156


 
از ادمین تشکر میکنم که همچین موضوع جالب و کاربردی رو نوشتن
در دانشگاه بنده استاد چند نمونه گفته که جالبه اینجا بگم
دو برنامه زیر، فقط در مورد تخصیص اولیه (خط سوم از برنامه دوم)، با هم اختلاف دارند. اما جالب است بدانید که مدت اجرای برنامه اول، در 5 دقیقه است. در حالی برنامه دوم، در کمتر از چند ثانیه اجرا می شود. حال فرض کنید که در یک برنامه بزرگ.......

کد پی‌اچ‌پی:
clear;
n=300000;
x(1)=0;
x(2)=1;
for 
k=3:n
x
(k)=x(k-1)+x(k-2);
end 
 

کد پی‌اچ‌پی:
clear;
n=300000;
x=zeros(1,n);     % Pre-Allocation
x
(1)=0;
x(2)=1;
for 
k=3:n
x
(k)=x(k-1)+x(k-2);
end