نمای ردیابی در CPU Profiler چندین راه برای مشاهده اطلاعات از ردیابی های ضبط شده ارائه می دهد.
برای ردیابیهای روش و ردیابی تابع، میتوانید نمودار تماس را مستقیماً در جدول زمانی Threads و برگههای Flame Chart ، Top Down ، Bottom Up و Events را از قسمت Analysis مشاهده کنید. برای فریم های پشته تماس، می توانید بخشی از کد اجرا شده و دلیل فراخوانی آن را مشاهده کنید. برای ردیابیهای سیستم، میتوانید Trace Events را مستقیماً در جدول زمانی Threads و برگههای Flame Chart ، Top Down ، Bottom Up و Events را از قسمت Analysis مشاهده کنید.
میانبرهای ماوس و صفحه کلید برای پیمایش آسانتر در نمودارهای تماس یا ردیابی رویدادها در دسترس هستند.
ردیابی ها را با استفاده از نمودار تماس بررسی کنید
نمودار فراخوانی یک نمایش گرافیکی از یک ردیابی متد یا ردیابی تابع را ارائه می دهد، که در آن دوره و زمان فراخوانی در محور افقی نمایش داده می شود و فراخوان های آن در امتداد محور عمودی نشان داده می شوند. تماسها با APIهای سیستم به رنگ نارنجی، تماسها با روشهای برنامه شما با رنگ سبز و تماسهای APIهای شخص ثالث (از جمله APIهای زبان جاوا) با رنگ آبی نشان داده میشوند. شکل 4 نمونه ای از نمودار فراخوانی را نشان می دهد و مفهوم زمان خود، زمان فرزندان و زمان کل را برای یک روش یا تابع معین نشان می دهد. می توانید در بخش نحوه بازرسی ردیابی ها با استفاده از بالا به پایین و پایین به بالا درباره این مفاهیم بیشتر بیاموزید.
نکته: برای پرش کد منبع یک متد یا تابع، روی آن کلیک راست کرده و Jump to Source را انتخاب کنید. این کار از هر یک از تب های پنل آنالیز کار می کند.
با استفاده از تب Flame Chart، ردیابی ها را بررسی کنید
برگه Flame Chart یک نمودار تماس معکوس را ارائه می دهد که پشته های تماس یکسان را جمع می کند. یعنی روشها یا عملکردهای یکسانی که توالی تماسگیرندگان یکسانی دارند جمعآوری میشوند و بهعنوان یک نوار طولانیتر در نمودار شعله نمایش داده میشوند (بهجای نمایش آنها بهعنوان چندین نوار کوتاهتر، همانطور که در نمودار تماس نشان داده شده است). این باعث میشود که ببینید کدام روشها یا عملکردها بیشترین زمان را مصرف میکنند. با این حال، این همچنین به این معنی است که محور افقی یک خط زمانی را نشان نمی دهد. در عوض، مدت زمان نسبی را برای اجرای هر متد یا تابع نشان می دهد.
برای کمک به تشریح این مفهوم، نمودار فراخوانی را در شکل 2 در نظر بگیرید. توجه داشته باشید که روش D چندین تماس با B (B 1 ، B 2 و B 3 ) برقرار می کند و برخی از آن فراخوانی ها به B، با C (C 1) تماس می گیرند. و ج 3 ).
از آنجایی که B 1 ، B 2 و B 3 دنباله تماس گیرندگان یکسانی دارند (A → D → B ) آنها تجمیع می شوند، همانطور که در شکل 3 نشان داده شده است. (A → D → B → C); توجه داشته باشید که C 2 گنجانده نشده است زیرا دارای توالی متفاوتی از تماس گیرندگان است (A → D → C).
همانطور که در شکل 4 نشان داده شده است، از فراخوان های انبوه برای ایجاد نمودار شعله استفاده می شود. توجه داشته باشید که برای هر فراخوانی در نمودار شعله، تماس هایی که بیشترین زمان CPU را مصرف می کنند، ابتدا ظاهر می شوند.
ردیابی را با استفاده از بالا به پایین و پایین به بالا بررسی کنید
برگه Top Down فهرستی از تماسها را نشان میدهد که در آن گسترش یک روش یا گره تابع، فراخوانهای آن را نشان میدهد. شکل 5 یک نمودار از بالا به پایین برای نمودار تماس در شکل 1 را نشان می دهد. هر فلش در نمودار از یک تماس گیرنده به یک تماس گیرنده اشاره می کند.
همانطور که در شکل 5 نشان داده شده است، گسترش گره برای روش A در تب Top Down ، فراخوانی های آن، روش های B و D را نشان می دهد. پس از آن، گسترش گره برای روش D، فراخوانی های آن، روش های B و C و غیره را نشان می دهد. شبیه به برگه نمودار شعله ، درخت از بالا به پایین اطلاعات ردیابی را برای روشهای یکسانی که پشته تماس یکسانی به اشتراک میگذارند، جمعآوری میکند. یعنی تب Flame chart یک نمایش گرافیکی از تب Top down ارائه می دهد.
برگه Top Down اطلاعات زیر را برای کمک به توصیف زمان صرف شده در CPU در هر تماس ارائه می دهد (زمان ها نیز به صورت درصدی از زمان کل رشته در محدوده انتخاب شده نشان داده می شوند):
- Self: زمانی که فراخوانی متد یا تابع صرف اجرای کد خود می شود و نه فراخوانی آن، همانطور که در شکل 1 برای روش D نشان داده شده است.
- فرزندان: زمانی که متد یا فراخوانی تابع صرف اجرای فراخوانهای خود و نه کد خود میشود، همانطور که در شکل 1 برای روش D نشان داده شده است.
- مجموع: مجموع زمان خود و فرزندان روش. این نشان دهنده کل زمانی است که برنامه برای اجرای یک تماس صرف کرده است، همانطور که در شکل 1 برای روش D نشان داده شده است.
تب Bottom Up فهرستی از تماسها را نشان میدهد که در آن با گسترش یک تابع یا گره روش، تماسگیرندگان آن نمایش داده میشود. با استفاده از ردیابی مثال نشان داده شده در شکل 5، شکل 6 یک درخت از پایین به بالا برای روش C ارائه می دهد. باز کردن گره برای روش C در درخت پایین به بالا، هر یک از فراخواننده های منحصر به فرد آن، روش های B و D را نمایش می دهد. توجه داشته باشید که، اگرچه B C را فراخوانی می کند. دو بار، B فقط یک بار هنگام گسترش گره برای روش C در درخت پایین به بالا ظاهر می شود. پس از آن، گسترش گره برای B، فراخوان دهنده آن، روش های A و D را نمایش می دهد.
تب Bottom Up برای مرتبسازی روشها یا توابع بر اساس مواردی که بیشترین (یا کمترین) زمان CPU را مصرف میکنند مفید است. میتوانید هر گره را بررسی کنید تا مشخص کنید کدام تماسگیرندگان بیشترین زمان CPU را برای فراخوانی آن روشها یا توابع صرف میکنند. در مقایسه با درخت از بالا به پایین، اطلاعات زمان بندی برای هر روش یا تابع در درخت پایین به بالا به متد بالای هر درخت (گره بالا) اشاره دارد. زمان CPU نیز به عنوان درصدی از زمان کل رشته در طول آن ضبط نشان داده می شود. جدول زیر به توضیح چگونگی تفسیر اطلاعات زمان بندی برای گره بالا و فراخوان دهنده های آن (گره های فرعی) کمک می کند.
خود | بچه ها | مجموع | |
---|---|---|---|
روش یا تابع در بالای درخت پایین به بالا (گره بالا) | کل زمانی را که متد یا تابع صرف اجرای کد خود کرده است و نه فراخواننده هایش را نشان می دهد. در مقایسه با درخت از بالا به پایین، این اطلاعات زمان بندی مجموعه ای از تماس های این روش یا تابع در طول مدت ضبط را نشان می دهد. | کل زمانی را که متد یا تابع صرف اجرای فراخوان های خود کرده است و نه کد خود را نشان می دهد. در مقایسه با درخت بالا به پایین، این اطلاعات زمانبندی مجموع تماسهای این روش یا فراخوانهای تابع را در طول مدت ضبط نشان میدهد. | مجموع زمان خود و زمان فرزندان. |
تماس گیرندگان (گره های فرعی) | مجموع زمان خود تماس گیرنده را هنگام فراخوانی توسط تماس گیرنده نشان می دهد. با استفاده از درخت پایین به بالا در شکل 6 به عنوان مثال، زمان خود برای روش B برابر است با مجموع زمان های خود برای هر اجرای روش C هنگامی که توسط B فراخوانی می شود. | مجموع زمان فرزندان تماس گیرنده را هنگام فراخوانی توسط تماس گیرنده نشان می دهد. با استفاده از درخت پایین به بالا در شکل 6 به عنوان مثال، زمان فرزندان برای روش B برابر است با مجموع دفعات فرزندان برای هر اجرای روش C هنگامی که توسط B فراخوانی می شود. | مجموع زمان خود و زمان فرزندان. |
توجه: برای یک ضبط مشخص، زمانی که نمایهساز به حد مجاز اندازه فایل برسد، Android Studio جمعآوری دادههای جدید را متوقف میکند (اما این کار ضبط را متوقف نمیکند). این معمولاً هنگام اجرای ردیابیهای ابزاردار خیلی سریعتر اتفاق میافتد، زیرا این نوع ردیابی در مقایسه با ردیابی نمونهبرداری شده، دادههای بیشتری را در زمان کوتاهتری جمعآوری میکند. اگر زمان بازرسی را به دورهای از ضبط که پس از رسیدن به حد مجاز رخ داده است افزایش دهید، دادههای زمانبندی در صفحه ردیابی تغییر نمیکند (زیرا داده جدیدی در دسترس نیست). علاوه بر این، زمانی که فقط بخشی از ضبط را انتخاب می کنید که داده ای در دسترس ندارد، پنجره ردیابی NaN را برای اطلاعات زمان نمایش می دهد.
ردیابی ها را با استفاده از جدول رویدادها بررسی کنید
جدول رویدادها همه تماسهای موجود در رشته انتخابشده فعلی را فهرست میکند. می توانید با کلیک بر روی سربرگ ستون ها آنها را مرتب کنید. با انتخاب یک ردیف در جدول، می توانید خط زمانی را به زمان شروع و پایان تماس انتخاب شده هدایت کنید. این به شما امکان می دهد رویدادها را به طور دقیق در جدول زمانی تعیین کنید.
فریم های پشته تماس را بررسی کنید
Callstacks برای درک اینکه کدام قسمت از کد اجرا شده است و چرا فراخوانی شده است مفید هستند. اگر یک Callstack Sample Recording برای یک برنامه جاوا/کوتلین جمع آوری شود، پشته تماس معمولاً نه تنها کد جاوا/کاتلین، بلکه فریم هایی از کد بومی JNI، ماشین مجازی جاوا (مثلاً android::AndroidRuntime::start
) و هسته سیستم ( [kernel.kallsyms]+offset
). این به این دلیل است که یک برنامه جاوا/کاتلین معمولاً از طریق ماشین مجازی جاوا اجرا می شود. برای اجرای خود برنامه و برای صحبت برنامه با سیستم و سخت افزار به کد بومی نیاز است. نمایه ساز این قاب ها را برای دقت ارائه می دهد. با این حال، بسته به تحقیقات شما، ممکن است این فریم های تماس اضافی را مفید بیابید یا نه. نمایه ساز راهی برای جمع کردن فریم هایی که به آنها علاقه ای ندارید ارائه می دهد تا بتوانید اطلاعاتی را که برای تحقیق شما نامربوط است پنهان کنید.
در مثال زیر، ردیابی زیر دارای فریم های زیادی با برچسب [kernel.kallsyms]+offset
است که در حال حاضر برای توسعه مفید نیستند.
برای جمع کردن این فریم ها در یکی، باید دکمه Collapse frames را از نوار ابزار انتخاب کنید، مسیرهای جمع شدن را انتخاب کنید و دکمه Apply را برای اعمال تغییرات خود انتخاب کنید. در این مثال، مسیر [kernel.kallsyms]
است.
با انجام این کار، فریم های مربوط به مسیر انتخاب شده در هر دو پانل چپ و راست، همانطور که در زیر نشان داده شده است، جمع می شود.
ردپای سیستم را بررسی کنید
هنگام بررسی یک ردیابی سیستم، می توانید Trace Events را در جدول زمانی Threads بررسی کنید تا جزئیات رویدادهای رخ داده در هر رشته را مشاهده کنید. نشانگر ماوس خود را روی یک رویداد نگه دارید تا نام رویداد و زمان صرف شده در هر ایالت را مشاهده کنید. برای مشاهده اطلاعات بیشتر در بخش تجزیه و تحلیل ، روی یک رویداد کلیک کنید.
بررسی ردپای سیستم: هسته های CPU
علاوه بر دادههای زمانبندی CPU، ردیابیهای سیستم همچنین شامل فرکانس CPU توسط هسته است. این میزان فعالیت روی هر هسته را نشان می دهد و ممکن است به شما ایده دهد که کدام یک از هسته های "بزرگ" یا "کوچک" در پردازنده های مدرن موبایل هستند.
صفحه Cores CPU (همانطور که در شکل 8 نشان داده شده است) فعالیت رشته برنامه ریزی شده در هر هسته را نشان می دهد. نشانگر ماوس خود را روی یک فعالیت رشته قرار دهید تا ببینید این هسته در آن زمان خاص روی کدام رشته در حال اجرا است.
برای اطلاعات بیشتر در مورد بازرسی اطلاعات ردیابی سیستم، به بخش بررسی مشکلات عملکرد رابط کاربری در اسناد systrace
مراجعه کنید.
بررسی ردپای سیستم: جدول زمانی رندر فریم
میتوانید بررسی کنید که برنامه شما چقدر طول میکشد تا هر فریم را در رشته اصلی رندر کند و RenderThread
برای بررسی تنگناهایی که باعث انحراف رابط کاربری و نرخ فریم پایین میشوند را بررسی کنید. برای آشنایی با نحوه استفاده از ردیابیهای سیستم برای بررسی و کمک به کاهش جابجایی UI، به تشخیص جابجایی UI مراجعه کنید.
بررسی ردپای سیستم: حافظه فرآیند (RSS)
برای برنامههایی که روی دستگاههای دارای Android 9 یا بالاتر نصب شدهاند، بخش Process Memory (RSS) میزان حافظه فیزیکی در حال استفاده برنامه را نشان میدهد.
مجموع
این مقدار کل حافظه فیزیکی است که در حال حاضر توسط فرآیند شما استفاده می شود. در سیستم های مبتنی بر یونیکس، این به عنوان "اندازه مجموعه مقیم" شناخته می شود و ترکیبی از تمام حافظه های مورد استفاده توسط تخصیص های ناشناس، نگاشت فایل ها و تخصیص حافظه مشترک است.
برای توسعه دهندگان ویندوز، Resident Set Size مشابه Working Set Size است.
اختصاص داده شده است
این شمارنده میزان حافظه فیزیکی که در حال حاضر توسط تخصیص حافظه معمولی فرآیند استفاده می شود را ردیابی می کند. اینها تخصیص هایی هستند که ناشناس (با یک فایل خاص پشتیبانی نمی شوند) و خصوصی (به اشتراک گذاشته نشده) هستند. در اکثر برنامه ها، این ها از تخصیص پشته (با malloc
یا new
) و حافظه پشته تشکیل شده اند. هنگامی که از حافظه فیزیکی مبادله می شود، این تخصیص ها در فایل تعویض سیستم نوشته می شود.
نقشه برداری فایل
این شمارنده مقدار حافظه فیزیکی را که فرآیند برای نگاشت فایل استفاده میکند، ردیابی میکند - یعنی حافظهای که توسط مدیر حافظه از فایلها به یک منطقه از حافظه نگاشت میشود.
به اشتراک گذاشته شده است
این شمارنده میزان حافظه فیزیکی مورد استفاده برای اشتراک گذاری حافظه بین این فرآیند و سایر فرآیندهای سیستم را ردیابی می کند.