افزایش سرعت اجرای برنامه ها در متلب مشاهده در قالب PDF چاپ فرستادن به ایمیل
نوشته شده توسط admin   
دوشنبه, 22 آبان 1391 ساعت 01:23

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

یکی از اشتباه هایی که بسیاری از برنامه نویسان متلب مرتکب می شوند، عدم تخصیص فضای مناسب برای آرایه ها و ماتریس ها، قبل از مقدار دهی است. زبان هایی مانند C یا #C (بخوانید سی شارپ)، در هنگام تعریف آرایه ها، اندازه آرایه ها را به صورت اجباری از برنامه نویس می خواهند و هر گاه در طول اجرای برنامه، بخواهیم که مقدار آرایه را در جایی که بیش از طول آرایه است، تغییر دهیم، برنامه خطا می دهد. اما متلب، از آن جا که سادگی را به عنوان محور اولیه در نظر گرفته است، چنین ضرورت هایی را به برنامه نویسی تحمیل نمی کند. اما مشکل دقیقا از همین جا شروع می شود. برای آرایه های کوچک، همه چیز به خوبی و خوشی تمام می شود. اما وقتی آرایه ها، از یک حد بزرگ تر می شوند، ایم مسأله واقعا دردسر ساز می شود.

در متلب، برای تخصیص فضای اولیه (Pre-Allocation)، از توابع مختلفی استفاده می شود. ازمیان این توابع، پر کاربردترین آن ها، تابع zeros است. این تابع ابعاد ماتریس مورد نظر را می گیرید، و بخشی از حافظه را به همان اندازه، برای آرایه موزذ نظر تخصیص می دهد. این کار، در زبان C، با تابع malloc انجام می شود. برای آگاهی بیشتر از چگونگی کارکرد این تابع، به راهنمای آن در هلپ متلب، مراجعه کنید.

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

 

 

 

برنامه اول:

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

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

منبع: farshadsoft.blogfa.com

نظر ها (2)
  • rezajan
    سلام چگونه می توان دادهای دما،بارش و...را در مطلب فصلی زدایی کرد(روند فصلی بودن را از داده ها بگیریم).
  • فرهادی
    سلام
    اما انصافا بازم سرعتش با زبانی مثل vc++ قابل مقایسه نیست.
    من یه برنامه داشتم که روی متلب (باتعریف اولیه آرایه ها در ابتدای برنامه) اجرا می کنم هر دور اجرای یک گام مشتق حدود بیش از 20 دقیقه زمان می گیره ولی روی vc++ بین بیست تا سی ثانیه.
    اصلا قابل مقایسه نیست.
    خودم وقتی متوجه این مسئله شدم :shock: شدم.
    ممنون بازهم متشکرم سایت خوبی دارید
تنها کاربران عضو شده می توانند نظر ارسال کنند!