CSCIENCE

CSCIENCE

۲ مطلب با کلمه‌ی کلیدی «کارایی» ثبت شده است

دلایل استفاده ناهمگامی (Asynchrony)



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

1. رابط کاربری (UI)
معروف‌ترین ابزارهای ایجاد رابط‌های کاربری در سیشارپ، Windows Form و WPF هستند. در هر دو تکنولوژی، برای مدیریت رابط کاربری (نمایش اجزا، رخدادها و ...) تنها از یک Thread* استفاده می‌شود. اکنون فرض کنید برنامه‌ی شما قرار است به عنوان مثال بعد از کلیک بر روی یک دکمه، عملیاتی طولانی را شروع کند (محاسبات پیچیده، درخواست‌های تحت شبکه، ورودی/خروجی دیسک و ...). با توجه به اینکه در خواست اجرا از طریق رابط کاربری بوده است و در آن‌جا تنها یک Thread وجود دارد، این عملیات، مدت زمان طولانی Thread مخصوص رابط کاربری را Block می‌کنند و در نتیجه رابط کاربری تا پایان عملیات، توانایی پاسخ‌گویی به کاربر را نخواهد داشت. درست است که عملیات مورد نظر در حال انجام است اما کاربر هیچگاه رابط کاربری از کار افتاده یا Unresponsive را نمی‌پسندد. بهتر است عملیات طولانی در Thread دیگر، موازی با رابط کاربری اجرا شود تا رابط کاربری همواره پاسخ‌گوی کاربر باشد و به نحوی میزان پیشرفت عملیات طولانی را نیز نمایش دهد.

2. استفاده از اوقات بیکاری CPU
گاهی اوقات در برنامه‌ها اعمالی وجود دارند که CPU را درگیر نمی‌کنند (مثل ورودی/خروجی دیسک)، یعنی CPU کار را به واحد دیگر می‌سپارد و منتظر می‌ماند تا آن واحد عملیات مورد نظر را انجام دهد. سپس دوباره به روند اجرای برنامه‌ی اصلی باز می‌گردد. از طرفی اعمالی که واحدهای دیگر انجام می‌دهند، معمولا طولانی و کند هستند و در نتیجه CPU مدت زمان زیادی را بیکار می‌ماند (البته منظور از بیکار بودن اینه که توی اون مدت با برنامه‌ی شما کاری نداره). اگر بتوانیم در این زمان عملیات قسمت دیگری از برنامه را تحویل CPU دهیم، توانسته‌ایم بیشترین استفاده را از CPU ببریم. این مسئله نیز با Asynchrony قابل حل است.

3. استفاده از حداکثر توان پردازشی
سخت‌افزارهایی که امروزه راهی بازار می‌شوند، بسیار قدرتمندتر از آنی هستند که ما (با برنامه‌های معمولی البته) از آن‌ها استفاده می‌کنیم. قلب کامپیوتر یعنی CPU هم از این قضیه مستثنا نیست. CPUهای فعلی حداقل 2 هسته‌ی پردازشی دارند. هسته‌ها می‌توانند قابلیت پردازش موازی و افزایش سرعت برنامه را فراهم کنند. در صورتی که برنامه‌ی شما موازی نباشد، شما تنها از یک هسته CPU استفاده می‌کنید (برای امتحان کافیست برنامه‌ای بنویسید که یک حلقه‌ی طولانی داشته باشد، آن را اجرا کنید و سپس از طریق Task Manager، میزان استفاده از CPU را چک کنید). قابلیت Async در سیشارپ امکان استفاده از همه‌ی هسته‌های پردازشی را به شما می‌دهد.


*مبحث Threadها در این سری آموزشی باز نخواهد شد. برای درک بهتر مفاهیم آموزشی، پیشنهاد می‌کنم از منابع دیگر در مورد Threadها مطالعه کنید.
۱ موافقین ۰ مخالفین ۰ ۲۴ اسفند ۹۲ ، ۱۸:۱۶
cscience

چند وقت پیش برای پروژه‌ی یکی از درس‌ها باید یک مقاله رو پیاده‌سازی می‌کردیم (گروه بودیم). این مقاله روی پیکسل‌های تصویر پردازش انجام می‌داد و چون تعداد تصاویر ورودی زیاد بودن، حجم محاسبات زیاد بود.

اولین پیاده‌سازی ما با متلب بود که زمان اجرایی برابر با 24 ساعت داشت. از اونجایی که متلب به صورت ذاتی کمی کند هست، سراغ سیشارپ رفتیم. پس از اینکه با سیشارپ پیاده سازی انجام شد، مدت زمان اجرا به 8 ساعت رسید که به نظر خیلی خوب بود. کمی بعد یکی از دوستانم که کاملا به دستورات سیشارپ (حتی از نظر کارایی) مسلطه، کد رو بازبینی کرد و دو تغییر زیر را ایجاد کرد:


1. در یک قسمت از برنامه به جای

Math.Pow(x,2)

عبارت x * x را قرار داد.

2. در قسمت دیگری از برنامه، محاسبات با اعداد صحیح کافی بود ولی من از double استفاده کرده بودم، پس بجای آن‌ها از int استفاده کرد.


پس از اجرای برنامه با تغییرات بالا، مدت زمان اجرا به 3 ساعت کاهش یافت. دلیل این اتفاق برای هریک از موارد بالا این است که:


1. تابع Pow در سیشارپ به دلیل اینکه قابلیت توان رساندن اعداد اعشاری را نیز داشته باشد، از روش ضربی استفاده نمی‌کند و بجای آن از روابط دیگری که محاسبات بیشتری لازم دارند استفاده می‌کند. حتی برای توان 2 (البته من فکر می‌کردم این تابع اونقدری هوشمنده که توان‌های صحیح و یا کوچیکو بدونه باید چیکار کنه).

2. محاسبات اعشاری کلا زمان بیشتری نسبت به محاسبات صحیح مصرف می‌کنند.


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

۴ موافقین ۰ مخالفین ۰ ۲۷ آذر ۹۲ ، ۱۱:۰۰
cscience