MohammadReza Rahmatzadeh
MohammadReza Rahmatzadeh
خواندن ۲ دقیقه·۴ سال پیش

خلاصه کتاب Pragmatic Programmer. درس 39

درس 39: Algorithm Speed

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

این مدل تخمین خیلی حیاتیه. بین دو یا چند راه مختلف انجام یک کار، بهتون کمک میکنه که بهینه تر رو انتخاب کنید و همچنین با پیش بینی ای از رشد دیتای سیستم و کاربران و ... به فکر scale سیستم باشید.

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

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

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

دروس مرتبط: 15

منبع کانال تلگرامی: https://t.me/pragmaticprogrammer_fa

pragmatic programmermarshalprogrammer
شاید از این پست‌ها خوشتان بیاید