- از پروژه ProfilingTest، عملیات Profiling را با استفاده از Yourkit بر روی کلاس JavaCup اجرا نموده و تابعی از پروژه که بیشترین مصرف منابع را دارد شناسایی کنید و آن را در گزارش خود در فایل README توضیح دهید. سپس نحوه پیادهسازی آن تابع را به گونهای تغییر دهید که مصرف منابع نسبت به قبل بهتر شود.
در ابتدا کلاس JavaCup را اجرا کردیم. اما به علت تعداد زیاد متغیرهایی که در تابع temp این کلاس به ArrayList افزوده میشود، این برنامه به خطای Out of Memory بر میخورد و حتی با افزایش حجم مجاز Heap در تنظیمات VM اینتلیجی، این خطا برطرف نشد. به منظور رفع این مشکل، بدون کم شدن از کلیت مسئله، range حلقهی داخلی را به 5000 کاهش دادیم.
سپس با کلیک راست بر روی کلاس JavaCup، آن را به همراه Profiling برنامهی Yourkit اجرا کردیم.
مقادیر ورودی برنامه را نیز برابر با اعداد 3 و 4 و 5 قرار دادیم که البته تاثیری در تابع temp ندارد اما مقدار چاپشدهی تابع eval را YES میکند.
خروجیهای Profiling برنامهی Yourkit برای این کلاس به شرح زیر میباشند.
این تصویر نشان میدهد که قسمت عمدهی زمان CPU یعنی حدود 83 درصد، در تابع temp سپری شدهاست و این تابع درواقع bottlneck این کلاس میباشد.
این تصویر نیز به خوبی نشان میدهد که عمدهی سربار اجرای تابع main کلاس JavaCup به فراخوانی تابع temp مربوط میشود. حال قصد داریم که با ایجاد تغییر در نحوهی پیادهسازی این تابع، سربار اجرایی آن را کاهش دهیم. با توجه به تصویر اول از خروجیهای profiling میتوان حدس زد که بخشی از این سربار به خاطر کوچک بودن ظرفیت اولیهی ArrayList و نیاز به گسترش آن میباشد. بنابراین با تخصیص یک ظرفیت اولیه که به اندازهی کافی بزرگ باشد، میتوان این مسئله را برطرف نمود. کد مورد نظر به صورت زیر میشود:
خروجی profiling این نسخهی ویرایشیافته به صورت زیر میباشد:
همانطور که در این خروجیها مشخص است، دیگر سربار اصلی کلاس، تابع temp نیست. بلکه فراخوانیهای Scanner است که بخش اعظم زمان اجرا را به خود اختصاص میدهند.
- قطعه کد دیگری (به جز الگوریتمهای مرتبسازی) به زبان جاوا بنویسید و سپس عملیات Profiling را با استفاده از Yourkit بر روی آن اجرا و بخشی از کد که بیشترین مصرف منابع را دارد شناسایی کنید. الگوریتم پیادهسازی آن قسمت را به گونهای تغییر دهید که این مشکل برطرف شده و مصرف منابع نسبت به حالت فعلی بهتر شود. توجه داشته باشید کامنت کردن کد و یا صرفنظر کردن از اجرای آن و موارد مشابه قابل قبول نیست. همراه با ارسال پروژه لازم است گزارشی در مورد عملکرد کد و نحوه برطرف شدن مشکل در پیادهسازی جدید را ارائه نمایید. گزارش باید حاوی تصاویری از وضعیت مصرف کلیه منابع در حالت قبل و بعد از پیادهسازی جدید باشد.
برای نمایش یک نمونهی دیگر از profiling، کدی نوشتهایم که در آن آرایهای از موجودیتهای Customer وجود دارد. سپس تعداد زیادی query بر اساس id این مشتریان، روی آن آرایه انجام خواهد شد. در مرحلهی اول، این query ها را به روش naive و با for روی آرایه و بررسی تکتک id ها انجام میدهیم. کد کلاسی که توصیف شد، به صورت زیر است:
حال این کلاس را profile میکنیم:
این دو تصویر از وضعیت مصرف CPU نشان میدهد که سربار اصلی اجرای این کلاس، مربوط به پاسخ دادن query ها است که به وضوح به صورت ناکارآمدی نیز پیادهسازی شدهاست. profiling وضعیت حافظهی برنامه نیز نتایج زیر را به بار دارد.
همچنین یک خلاصه از منابع مصرفی این کلاس در تصویر زیر قابل مشاهده است.



















