Skip to content

Using Yourkit for profiling and improving a java app

License

Notifications You must be signed in to change notification settings

msrazavi/Yourkit_Profiling

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Yourkit_Profiling

تمرین

  1. از پروژه ProfilingTest، عملیات Profiling را با استفاده از Yourkit بر روی کلاس JavaCup اجرا نموده و تابعی از پروژه که بیش‌ترین مصرف منابع را دارد شناسایی کنید و آن را در گزارش خود در فایل README توضیح دهید. سپس نحوه پیاده‌سازی آن تابع را به گونه‌ای تغییر دهید که مصرف منابع نسبت به قبل بهتر شود.

در ابتدا کلاس JavaCup را اجرا کردیم. اما به علت تعداد زیاد متغیرهایی که در تابع temp این کلاس به ArrayList افزوده می‌شود، این برنامه به خطای Out of Memory بر می‌خورد و حتی با افزایش حجم مجاز Heap در تنظیمات VM اینتلیجی، این خطا برطرف نشد. به منظور رفع این مشکل، بدون کم شدن از کلیت مسئله، range حلقه‌ی داخلی را به 5000 کاهش دادیم.

سپس با کلیک راست بر روی کلاس JavaCup، آن را به همراه Profiling برنامه‌ی Yourkit اجرا کردیم.

image

مقادیر ورودی برنامه را نیز برابر با اعداد 3 و 4 و 5 قرار دادیم که البته تاثیری در تابع temp ندارد اما مقدار چاپ‌شده‌ی تابع eval را YES می‌کند.

image

خروجی‌های Profiling برنامه‌ی Yourkit برای این کلاس به شرح زیر می‌باشند.

image

image

این تصویر نشان می‌دهد که قسمت عمده‌ی زمان CPU یعنی حدود 83 درصد، در تابع temp سپری شده‌است و این تابع درواقع bottlneck این کلاس می‌باشد.

image

image

image

این تصویر نیز به خوبی نشان می‌دهد که عمده‌ی سربار اجرای تابع main کلاس JavaCup به فراخوانی تابع temp مربوط می‌شود. حال قصد داریم که با ایجاد تغییر در نحوه‌ی پیاده‌سازی این تابع، سربار اجرایی آن را کاهش دهیم. با توجه به تصویر اول از خروجی‌های profiling می‌توان حدس زد که بخشی از این سربار به خاطر کوچک بودن ظرفیت اولیه‌ی ArrayList و نیاز به گسترش آن می‌باشد. بنابراین با تخصیص یک ظرفیت اولیه که به اندازه‌ی کافی بزرگ باشد، می‌توان این مسئله را برطرف نمود. کد مورد نظر به صورت زیر می‌شود:

image

خروجی profiling این نسخه‌ی ویرایش‌یافته به صورت زیر می‌باشد:

image

image

image

image

image

image

همانطور که در این خروجی‌ها مشخص است، دیگر سربار اصلی کلاس، تابع temp نیست. بلکه فراخوانی‌های Scanner است که بخش اعظم زمان اجرا را به خود اختصاص می‌دهند.

  1. قطعه کد دیگری (به جز الگوریتم‌های مرتب‌سازی) به زبان جاوا بنویسید و سپس عملیات Profiling را با استفاده از Yourkit بر روی آن اجرا و بخشی از کد که بیش‌ترین مصرف منابع را دارد شناسایی کنید. الگوریتم پیاده‌سازی آن قسمت را به گونه‌ای تغییر دهید که این مشکل برطرف شده و مصرف منابع نسبت به حالت فعلی بهتر شود. توجه داشته باشید کامنت کردن کد و یا صرفنظر کردن از اجرای آن و موارد مشابه قابل قبول نیست. همراه با ارسال پروژه لازم است گزارشی در مورد عملکرد کد و نحوه برطرف شدن مشکل در پیاده‌سازی جدید را ارائه نمایید. گزارش باید حاوی تصاویری از وضعیت مصرف کلیه منابع در حالت قبل و بعد از پیاده‌سازی جدید باشد.

برای نمایش یک نمونه‌ی دیگر از profiling، کدی نوشته‌ایم که در آن آرایه‌ای از موجودیت‌های Customer وجود دارد. سپس تعداد زیادی query بر اساس id این مشتریان، روی آن آرایه انجام خواهد شد. در مرحله‌ی اول، این query ها را به روش naive و با for روی آرایه و بررسی تک‌تک id ها انجام می‌دهیم. کد کلاسی که توصیف شد، به صورت زیر است:

image image

حال این کلاس را profile می‌کنیم:

image image

این دو تصویر از وضعیت مصرف CPU نشان می‌دهد که سربار اصلی اجرای این کلاس، مربوط به پاسخ دادن query ها است که به وضوح به صورت ناکارآمدی نیز پیاده‌سازی شده‌است. profiling وضعیت حافظه‌ی برنامه نیز نتایج زیر را به بار دارد.

image

همچنین یک خلاصه از منابع مصرفی این کلاس در تصویر زیر قابل مشاهده است.

image

About

Using Yourkit for profiling and improving a java app

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%