CSCIENCE

CSCIENCE

دو تجربه در افزایش سرعت اجرا برنامه سیشارپ

چهارشنبه, ۲۷ آذر ۱۳۹۲، ۱۱:۰۰ ق.ظ

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

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


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

Math.Pow(x,2)

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

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


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


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

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


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

نظرات (۴)

۰۸ دی ۹۲ ، ۱۵:۵۹ آرش قیطاسوند
مرسی استاد.
شاید تو ++C زیاد احساس نشه،اما اینکه حواسم ب ظرفیت متغیرهام باشه تا الان زیاد برام مهم نبود،اما حالا ب اهمیتش پی بردم.
درباره اون دستور math.pow توی ++c میشه همون pow خودمون با هدر math دیگه؟پس تو ++c هم باید حواسمون ب این موضوع باشه،درسته؟
پاسخ:
در مورد ++C هم چون دستور pow با مقادیر اعشاری کار میکنه باید همینطور باشه.
البته overload که توان عدد صحیح باشه وجود داره، در نتیجه فکر کنم تو ++C بین این تابع با ضرب معمولی تفاوتی وجود نداشته باشه.
جالب بود..
Nice One , Thanks Gates
Nice One , Thanks Gates

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی