بایگانی

بایگانی برای دسته ی ‘آکادمیا’

بهینه‌سازی سرعت اجرای برنامه‌ها در Matlab -قسمت اول

۲۲ شهریور ۱۳۸۸ ۲ دیدگاه

خوب در قسمت قبلی، خیلی وارد خود بحث بهینه‌سازی نشدم و بیشتر به مقدمه و حاشیه‌ی کار پرداختم.  ولی امروز می‌خواهم کم کمک وارد بحث اصلی بشوم.

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

موارد ۱ و ۲ را که در پست قبلی نوشته بودم. پس حالا می‌رویم سراغ مورد سوم:

۳- مشخص کردن گلوگاه‌های برنامه را می‌توان به عنوان گام بعدی برای هر گونه بهینه‌سازی بیان کرد. زیرا معمولا در هر برنامه یک یا چند نقطه‌ی گلوگاهی وجود دارد که باعث می‌شوند بهینه‌سازی سایر نقاط تاثیر چندانی بر عملکرد برنامه نداشته باشند.  به عنوان مثال، تصور کنید که برنامه‌ی شما ۲  تابع داشته باشد. که یکی ۹۸% زمان اجرا را به خود اختصاص بدهد و دیگری فقط ۲%. اگر شما حدس بزنید که با یک ساعت کلنجار رفتن با کد تابع اول می‌توانید آن را ۲ برابر سریع‌تر کنید و یا با صرف همین زمان بر روی تابع دوم  می‌توانید آن را ۲۰ برابر سریع‌تر کنید، ترجیح می‌دهید بر روی بهینه‌سازی کدام تابع کار کنید؟ ( بهینه‌سازی تابع اول زمان کلی را تفریبا نصف می‌کند ولی بهینه‌سازی تابع دوم تقریبا تاثیری روی زمان اجرای برنامه ندارد). وقتی شما یک تکه کد نوشته شده و آماده دارید دستور profiler در matlab می‌‌تواند بسیار کارگشا باشد. روش کار هم بسیار ساده است.

ابتدا در خط دستور بنویسید

>>profiler on
>>profiler clear

سپس برنامه‌ی خودتان را اجرا کنید و پس از اجرای آن بنویسید

>>profiler view

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

حالا که گلوگاه مشخص شد، باید دید چگونه می‌توان آن را بر طرف کرد.

۳- شاید ساده‌ترین و اولین گامی که باید در راستای تسریع برنامه‎‌های matlab برداشت، تخصیص حافظه به آرایه‌ها و ماتریس‌ها قبل از شروع محاسبات باشد که اصطلاحا preallocation نامیده می‌شود. در matlab این امکان وجود دارد که در حین اجرای برنامه، سایز آرایه‌ها و ماتریس‌ها آن را تغییر داد. ولی از آنجایی که این عمل خیلی بهینه نمی‌باشد و تغییر اندازه آرایه‌ها به صورت پویا و در حین اجرای برنامه  بسیار کند انجام می‌شود، انجام مکرر آن به راحتی می‌تواند تبدیل به گلوگاه اجرای برنامه شود.

۴- یکی از توانمندی‌های مهم matlab انجام محاسبات برداری و ماتریسی با سرعت و بازده بالا می‌باشد و بر خلاف این گونه محاسبات، اجرای حلقه‌ها (مانند for و یا while) و دسترسی به خانه‌های یک آرایه از طریق اندیس‌ به شدت کند و غیر بهینه می‌باشد. به همین دلیل با حذف دسترسی با اندیس به المان‌های آرایه‌ها و ماتریس‌ها و همچنین حذف حلقه‌ها و به جای آن‌ها پیاده سازی الگوریتم به کمک عملیات برداری می‌توان سرعت اجرا به مقدار قابل توجهی افزایش داد.

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

*قسمت بعدی احتمالا قسمت آخر این مجموعه می‌باشد.

بهینه‌سازی سرعت اجرای برنامه‌ها در Matlab -مقدمه

۱۲ شهریور ۱۳۸۸ ۱ دیدگاه

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

ولی به کرات دیده‌ایم که برنامه‌نوسان matlab (حتی کسانی که مدت‌هاست با matlab کد ‌‎زده‎اند) از کندی برنامه‌هایشان می‌نالند و  آن طور که لازمه نمی‌توانند از matlab  کام بگیرند. در این پست و مجموعه پست‎های بعدی، من تصمیم ندارم که حرف تازه‌ای بزنم و یا تکنیک خارخ العاده‌ای را بیان کنم. هدف فقط بیان مجدد تکنیک‌های بسیار ساده و در عین حال بسیار موثری است که در چندین سال گذشته از افراد با تجربه‌ و یا  از روی منابع موجود در اینترنت یاد گرفته‌ام. امید است که دردی از دیگران را هم دوا کند.

حالا از این حرف و حدیث‎ها که بگذریم و بیاییم سر اصل مطلب:

۱-  قبل از هر کاری، سعی کنید که دستورات matlab را به خوبی یاد بگیرید. عموما دستورات built-in بسیار بهینه نوشته شده‌اند و به درستی عملکردشان هم به خوبی می‌توان اعتماد کرد. پس گاهی بد نیست به جای اینکه سریع مشغول کد زدن بشویم، در ابتدای کار کمی هم وقت به یادگیری بیشتر matlab اختصاص بدهیم.

۲- آقا! خانم! محترم؛ تو را بخدا برای کدت کامنت بگذار. به هر زبانی که کد می‌نویسی کامنت بگذار. برای خودت می‌گم، چند ماه دیگه که می‌خواهی یک خط از کد را تغییر بدهی، نیایی گوشه‌ی آفیست بنشینی و زار زاز گریه کنی که یادم رفته کد چه جوری کار می‌کرد. این قضیه را باید در حین بهینه‌سازی کد بیشتر جدی گرفت. چون بهینه‌سازی شبیه رمز کردن کد است. در حین بهینه‌سازی کد به سرعت شکل و فرم پیچیده‌ای به خودش می‌گیرد و اصطلاحا از readable بودن کد کاسته می‌شود.

ادامه دارد ...

پس نوشت: خیلی وقت بود که شروع به نوشتن این پست کرده بودم. ولی چون فرصت نمی‌شد کاملش کنم، مدام منتشر کردن این پست را عقب‌ می‌انداختم. اما حالا تصمیم گرفتم فعلا این مقدمه را منتشر کنم که در مقابل کار انجام شده قرار بگیرم :D

تموم شد

۲۸ مرداد ۱۳۸۸ ۶ دیدگاه

تزم را دفاع کردم و تموم شد.

Categories: آکادمیا Tags:

خداحافظ MCL

۲۶ مرداد ۱۳۸۸ ۱ دیدگاه

یارب مرا یاری بده تا خوب آزارش کنم

هجرش دهم، زجرش دهم ،خوارش کنم ،زارش کنم ... +

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

از بوسه های آتشین ، وز خنده های دل نشین

صد شعله در جانش زنم،صد فتنه در کارش کنم

در پیش چشمش ساغری گیرم ز دست دلبری

از رشک آزارش دهم ،از غصه بیمارش کنم

...

اندر احوالات پت

۲۱ مرداد ۱۳۸۸ بدون دیدگاه

خدمتون بگم که بالاخره ۲-۳ روز پیش، این تز ما نوشته و با سلام و صلوات تقدیم کمیته‌ی داوران شد. این داستان دفاع ما داشت تبدیل به یکی این داستان‌های جکی می‌شد که برای بقیه تجربه است و برای خودمون خاطره!! باور ندارید؟ بزارید فقط یک چشمه از داستان را براتون بگم خودتون می‌گوید جگرمون کباب شد، بقیه‌اش را نگو.

قضیه از این قراره که بنده ۱۹ آگوست دفاع می‌کنم و بعد از دفاع اصولا باید اول یک دوش بگیرم تا رنگ قهوه‌ای ناشی از سوال و جواب‌های اعضای کمیته پاک بشود و بعد هم اصلاحات تز را انجام بدهم و تز را بدهم به کتابخانه. بعد هم از ۷ سپتامبر باید کارم را با ۲ تا استاد جدیدم شروع کنم. با خودم گفتم کمی جل بازی بد نیست و بهتره برای خود شیرینی هم که شده، کمی زودتر بهشون یک سری بزنم. به این بندگان خدا ای‌میل زدم که آره من می‌خوام خدمتان شرفیاب بشوم. و اما جواب استاد سخت کوبنده بود و فریاد از نهاد ما در آورد و آسمان را لرزاند.  فکرش را بکنید استاد آدم یادش رفته باشه که به آدم پذیرش داده ! و در جواب بگه که شرمنده و دانشجوی جدید نمی‌خواهم! حالا من نمی‌دونستم که گریه کنم و یا خنده.  البته چند ساعت بعد مشکل حل شد. (ولی  مت می‌گه بعید می‌دونم، این تازه اولشه ;) )  ولی خداییش داره جنسمون جور می‌شه تا حالا پت و مت داشتیم، ولی از امروز پت و مت و پنوس

Categories: آکادمیا, تز, روزمره Tags: , , , ,

۹۱۳ و یا اینکه چرا زمان اینقدر تند می‌گذرد؟!

۳ تیر ۱۳۸۸ ۱ دیدگاه

فکر می‌کنید این ۹۱۳ چیه؟ این ۹۱۳، ۹۱۳ ساعت از عمر من است که در یک سال و ۸ ماه گذشته پای browser کامپیوترم توی آزمایشگاه هدر رفته است. ۹۱۳ ساعت می‌شود تقریبا ۳۸ روز، یعنی ۵ هفته و نیم!تازه این زمان فقط مربوط است به زمانی که در آزمایشگاهمان هدر داده‌ام، حساب زمان هدر رفته در خانه که جای خودش را دارد.

فکرش را بکنید چند تا برنامه‌ی کوه و یا تفریحی می‌توانستم در این زمان داشته باشم. چند تا کتاب می‌توانستم بخوانم؟ (چیزی حدود  ۱۰۰۰۰۰ صفحه کتاب ) چقدر در ساز زدن می‌توانستم پیشرفت کنم؟ حتی حالا که فکرش را می‌کنم اگر با کم‌ترین حقوق ممکن هم کار کرده بودم چیزی حدود ۹ هزار دلار بیشتر توی حسابم بود.

این آمار را با کمک افزونه‌ی Time Tracker در فایرفاکس بدست آوردم. به نظرم هر دانشجو توی این دوره زمانه نیاز به داشتن همچین افزونه‌ای روی کامپیوترش هست، تا وقتی که به آخر دوره‌ی کارش نزدیک می‌شود، بتواند به این سوال پاسخ دهد که

راستی، چرا زمان اینقدر تند می‌گذرد؟!

Call For Paper

۱۰ خرداد ۱۳۸۸ بدون دیدگاه

دقیقا نمی‌دانم که از چه ترجمه‌ای  می‌توان برای Call For Paper استفاده کرد، شاید «فرآخوان مقاله» بد نباشد. از اسم و کلمه که بگذریم، هر کسی بعد از یک مدت کار آکادمی، می‌تواند چند تایی مقاله چاپ کند، ولی خوب کجا؟ معمولا در هر زمینه‌ی کاری چند تا کنفرانس و ژورنال معروف هست که همه آن‌ها را می‌شناسند و ترجیح می‌دهند مقاله‌هایشان را در آن‌ها چاپ و یا ارائه کنند. ولی برای خود من پیش آمده زمان یک کنفرانس بسیار مهم را فراموش کرده‌ام و یا دیر به فکر افتاده‌ام و یا گاهی هم پیش می‌آید که به دنبال یک کنفراس در اطراف محل زندگی‌مان هستیم یا عجله داریم که یک مقاله را هر چه سریع‌تر چاپ کنیم. در همه‌ی این حالات فکر کنم WikiCFP چیز جالب و بدرد بخوری باشد

WikiCFP: a wiki for "Call For Papers

دیگر نکته‌ی خوب این ویکی داشتن فیدهای متنوع است که می‌توانید آن را به ابزار فیدخوانتان اضافه کنید و یک جورهایی به روز باشید