- Alireza Ziaee
- Abdollah Zohrabi
1.ابتدا profilling را بر روی کلاس javaCup اجرا میکنیم:
بعد از دادن ورودیها به برنامه، برنامه با خطای OutOfMemoryError متوقف میشود.

سپس مشاهده میکنیم که باتوجه به اطلاعات CPU از نرم افزارYourkit بیشترین مصرف منابع را javaCup.main() و javaCup.temp() دارد:
با بررسی کد تابع temp میبینیم که این تابع از ArrayList برای ذخیرهکردن داده استفاده میکند و چون object است در heap نگهداری میشود و خطایی که با آن برخورد کردیم به دلیل بزرگشدن heap بود. با توجه به اینکه تعداد آیتمهایی که میخواهیم ذخیره کنیم تعداد ثابتی دارند میتوانیم از آرایه استفاده کنیم تا داده در stack ذخیره شود. پس تابع temp را به صورت زیر تغییر میدهیم.
با اعمال تغییر گفتهشده مشاهده میکنیم برنامه بدون خطا اجرا میشود. نمودارهای مربوط به برنامهی اصلاح شده را در زیر مشاهده میکنیم.
2.
برنامه موردنظر برای profiling:
در این قسمت ما برنامه ای را نوشته ایم که یک کاراکتر و دو عدد n و m را در ورودی میگیرد و سپس یک شکل مثلث به اندازه n از ان کاراکتر ساخته و ان را به تعداد
m بار کپی میکند.
ابتدا برای این کار از قطعه کد زیر استفاده کردیم که داده ها را به صورت ارایه دوبعدی ذخیره و سپس چاپ به صورت ارایه ای چاپ کردیم.
عملیات profiling را با استفاده از نرم افزار Yourkit بر روی ان انجام میدهیم:
همان طور که در شکل زیر مشاهد میشود بیشترین منابع را char_triangle_Builder به دلیل و جود print های پی در پی دارد مصرف میکنند بنابراین نتیجه میگیریم که امکان دارد از لحاظ پیاده سازی بهینه نباشد.
قطعه کد اصلاح شده که به صورت string کاراکتر های مورد نظر را چاپ میکند به عبارتی در حالت قبل تداد پرینت ها به ازای m<<n منتاسب با مجذور تعداد پرینت ها در این قسمت است.
قطعه کد جدید:
در حالت دوم مشاهده کردیم که مصرف منابع در حد خوبی کاهش یافته همچنین درصد منابعی که صرف printمیشد از 98 درصد به 90 درصد کاهش پیدا کرده است.همچنین میزان استفاده از cpuهم با مقدار قابل توجهی کاهش یافته .








