มุมมองการติดตามใน CPU Profiler มีหลายวิธีในการดูข้อมูล จากการติดตามที่บันทึกไว้
สำหรับร่องรอยของเมธอดและร่องรอยของฟังก์ชัน คุณสามารถดูแผนภูมิการเรียกได้ โดยตรงในไทม์ไลน์เธรดและแท็บแผนภูมิเปลวไฟ จากบนลงล่าง จากล่างขึ้นบน และเหตุการณ์จากแผงการวิเคราะห์ สำหรับเฟรม Callstack คุณจะดูส่วนของโค้ดที่ดำเนินการแล้วและเหตุผลที่เรียกใช้ได้ สำหรับการติดตามระบบ คุณสามารถดูเหตุการณ์การติดตามได้โดยตรงในไทม์ไลน์เธรด และแท็บแผนภูมิเปลวไฟ จากบนลงล่าง จากล่างขึ้นบน และเหตุการณ์จากแผงการวิเคราะห์
แป้นพิมพ์ลัดและเมาส์พร้อมให้ใช้งานเพื่อการนำทางที่ง่ายขึ้นในแผนภูมิการโทรหรือเหตุการณ์การติดตาม
ตรวจสอบการติดตามโดยใช้แผนภูมิการเรียก
แผนภูมิการเรียกแสดงภาพการติดตามเมธอดหรือการติดตามฟังก์ชัน โดยระยะเวลาและการกำหนดเวลาของการเรียกจะแสดงบนแกนนอน และผู้ถูกเรียกจะแสดงตามแกนตั้ง การเรียก API ของระบบจะแสดงเป็นสีส้ม การเรียกเมธอดของแอปจะแสดงเป็นสีเขียว และการเรียก API ของบุคคลที่สาม (รวมถึง API ของภาษา Java) จะแสดงเป็นสีน้ำเงิน รูปที่ 4 แสดงแผนภูมิการเรียกตัวอย่างและอธิบายแนวคิดของ เวลาของตัวเอง เวลาของฟังก์ชันย่อย และเวลารวมสำหรับเมธอดหรือฟังก์ชันที่กำหนด คุณดูข้อมูลเพิ่มเติมเกี่ยวกับแนวคิดเหล่านี้ได้ในส่วนวิธีตรวจสอบการติดตามโดยใช้ Top Down และ Bottom Up
รูปที่ 1 แผนภูมิการโทรตัวอย่างที่แสดง เวลาของตัวเอง เวลาของลูก และเวลารวมสำหรับเมธอด D
เคล็ดลับ: หากต้องการข้ามไปยังซอร์สโค้ดของเมธอดหรือฟังก์ชัน ให้คลิกขวาที่เมธอดหรือฟังก์ชันนั้น แล้วเลือกข้ามไปยังแหล่งที่มา ซึ่งใช้ได้จากแท็บใดก็ได้ในแผงการวิเคราะห์
ตรวจสอบร่องรอยโดยใช้แท็บแผนภูมิเปลวไฟ
แท็บแผนภูมิเปลวไฟแสดงแผนภูมิการเรียกแบบกลับด้านที่รวบรวม สแต็กการเรียกที่เหมือนกัน กล่าวคือ ระบบจะรวบรวมเมธอดหรือฟังก์ชันที่เหมือนกันซึ่งใช้ลำดับผู้โทรเดียวกัน และแสดงเป็นแถบที่ยาวขึ้นใน แผนภูมิเปลวไฟ (แทนที่จะแสดงเป็นแถบที่สั้นกว่าหลายแถบ ดังที่แสดงใน แผนภูมิการเรียก) ซึ่งจะช่วยให้คุณดูได้ง่ายขึ้นว่าเมธอดหรือฟังก์ชันใดใช้เวลามากที่สุด อย่างไรก็ตาม การดำเนินการนี้ยังหมายความว่าแกนนอนไม่ได้แสดงไทม์ไลน์ แต่จะแสดงระยะเวลาสัมพัทธ์ที่แต่ละเมธอดหรือฟังก์ชันใช้ในการดำเนินการแทน
ดูแผนภูมิการเรียกในรูปที่ 2 เพื่อช่วยอธิบายแนวคิดนี้ โปรดทราบว่าเมธอด D จะเรียก B หลายครั้ง (B1, B2 และ B3) และการเรียก B บางครั้งจะเรียก C (C1 และ C3)
รูปที่ 2 แผนภูมิการโทรที่มีการเรียกใช้เมธอดหลายรายการ ซึ่งใช้ลำดับผู้โทรร่วมกัน
เนื่องจาก B1, B2 และ B3 มีลำดับผู้โทรเหมือนกัน (A → D → B) ระบบจึงรวบรวมข้อมูลตามที่แสดงในรูปที่ 3 ในทํานองเดียวกัน ระบบจะรวบรวม C1 และ C3 เนื่องจากมีลําดับผู้โทรเหมือนกัน (A → D → B → C) โปรดทราบว่าระบบจะไม่รวม C2 เนื่องจากมีลําดับผู้โทรที่แตกต่างกัน (A → D → C)
รูปที่ 3 รวบรวมวิธีการที่เหมือนกันซึ่งใช้สแต็กการเรียกใช้เดียวกัน
ระบบจะใช้การเรียกที่รวบรวมไว้เพื่อสร้างแผนภูมิเปลวไฟ ดังแสดงในรูปที่ 4 โปรดทราบว่าสำหรับการเรียกใดๆ ในแผนภูมิเปลวเพลิง ผู้ถูกเรียกที่ใช้เวลา CPU มากที่สุดจะปรากฏก่อน
รูปที่ 4 แผนภูมิเปลวไฟแสดงการเรียก แผนภูมิที่แสดงในรูปที่ 5
ตรวจสอบการติดตามโดยใช้ "จากบนลงล่าง" และ "จากล่างขึ้นบน"
แท็บจากบนลงล่างจะแสดงรายการการเรียกที่การขยายเมธอดหรือ โหนดฟังก์ชันจะแสดงผู้ถูกเรียก รูปที่ 5 แสดงกราฟจากบนลงล่างสำหรับแผนภูมิการเรียกในรูปที่ 1 ลูกศรแต่ละอันในกราฟจะชี้จากผู้โทรไปยังผู้รับสาย
ดังที่แสดงในรูปที่ 5 การขยายโหนดสำหรับเมธอด A ในแท็บจากบนลงล่าง จะแสดงเมธอดที่เรียกใช้ ซึ่งก็คือเมธอด B และ D หลังจากนั้น การขยายโหนดสำหรับเมธอด D จะแสดงผู้เรียก เมธอด B และ C และอื่นๆ คล้ายกับแท็บแผนภูมิเปลวไฟ แผนภูมิต้นไม้จากบนลงล่างจะรวบรวมข้อมูลการติดตามสำหรับเมธอดที่เหมือนกันซึ่ง ใช้สแต็กการเรียกเดียวกัน กล่าวคือ แท็บแผนภูมิเปลวไฟจะแสดงภาพ ของแท็บจากบนลงล่าง
แท็บจากบนลงล่างจะแสดงข้อมูลต่อไปนี้เพื่อช่วยอธิบายเวลา CPU ที่ใช้ในการเรียกแต่ละครั้ง (เวลาจะแสดงเป็นเปอร์เซ็นต์ของเวลาทั้งหมดของ เธรดในช่วงที่เลือกด้วย)
- ตนเอง: เวลาที่ใช้ในการเรียกใช้เมธอดหรือฟังก์ชันในการดำเนินการโค้ดของตัวเอง และไม่ใช่โค้ดของผู้ที่ถูกเรียก ดังแสดงในรูปที่ 1 สำหรับเมธอด D
- บุตรหลาน: เวลาที่ใช้ในการเรียกใช้เมธอดหรือฟังก์ชันในการดำเนินการ ผู้ถูกเรียกและไม่ใช่โค้ดของตัวเอง ดังแสดงในรูปที่ 1 สำหรับเมธอด D
- ทั้งหมด: ผลรวมของเวลาที่ตนเองและบุตรหลานใช้ในวิธีการ ซึ่ง แสดงถึงเวลาทั้งหมดที่แอปใช้ในการดำเนินการโทร ตามที่แสดงใน รูปที่ 1 สำหรับวิธี D

รูปที่ 5 แผนผังจากบนลงล่าง

รูปที่ 6 แผนผังจากล่างขึ้นบนสำหรับเมธอด C จาก รูปที่ 5
แท็บจากล่างขึ้นบนจะแสดงรายการการเรียกที่การขยายโหนดของฟังก์ชันหรือเมธอดจะแสดงผู้เรียก การใช้ตัวอย่างการติดตามที่แสดงในรูปที่ 5 รูปที่ 6 แสดงแผนผังจากล่างขึ้นบนสำหรับเมธอด C การเปิดโหนดสำหรับเมธอด C ในแผนภูมิด้านล่างขึ้นบนจะแสดงผู้เรียกที่ไม่ซ้ำกันแต่ละราย ซึ่งก็คือเมธอด B และ D โปรดทราบ ว่าแม้ B จะเรียก C 2 ครั้ง แต่ B จะปรากฏเพียงครั้งเดียวเมื่อขยายโหนดสำหรับ เมธอด C ในแผนผังจากล่างขึ้นบน หลังจากนั้น การขยายโหนดสำหรับ B จะแสดง ผู้โทรของโหนด ซึ่งก็คือเมธอด A และ D
แท็บจากล่างขึ้นบนมีประโยชน์ในการจัดเรียงเมธอดหรือฟังก์ชันตามรายการที่ใช้เวลา CPU มากที่สุด (หรือน้อยที่สุด) คุณสามารถตรวจสอบแต่ละโหนดเพื่อระบุ ผู้เรียกที่ใช้เวลา CPU มากที่สุดในการเรียกใช้เมธอดหรือฟังก์ชันเหล่านั้น เมื่อเทียบกับโครงสร้างแบบบนลงล่าง ข้อมูลเวลาสำหรับแต่ละเมธอดหรือฟังก์ชันในโครงสร้างแบบล่างขึ้นบนจะอ้างอิงถึงเมธอดที่ด้านบนของแต่ละโครงสร้าง (โหนดบนสุด) เวลา CPU ยังแสดงเป็นเปอร์เซ็นต์ของเวลาทั้งหมดของเธรดในระหว่างการบันทึกนั้นด้วย ตารางต่อไปนี้ช่วยอธิบายวิธีตีความข้อมูลเวลา สำหรับโหนดบนสุดและผู้เรียก (โหนดย่อย)
ตนเอง | เด็ก | รวม | |
---|---|---|---|
วิธีการหรือฟังก์ชันที่ด้านบนของแผนผังจากล่างขึ้นบน (โหนดบนสุด) | แสดงเวลาทั้งหมดที่เมธอดหรือฟังก์ชันใช้ในการเรียกใช้ โค้ดของตัวเอง ไม่ใช่โค้ดของผู้ที่เรียกใช้ เมื่อเทียบกับแผนภูมิต้นทาง ข้อมูลการจับเวลานี้แสดงถึงผลรวมของการเรียกทั้งหมดไปยังเมธอดหรือฟังก์ชันนี้ ตลอดระยะเวลาการบันทึก | แสดงเวลาทั้งหมดที่เมธอดหรือฟังก์ชันใช้ในการเรียกใช้ ผู้ถูกเรียกและไม่ใช่โค้ดของตัวเอง เมื่อเทียบกับแผนภูมิต้นไม้จากบนลงล่าง ข้อมูลการจับเวลานี้แสดงถึงผลรวมของการเรียกทั้งหมดไปยัง วิธีการหรือฟังก์ชันที่เรียกใช้ในช่วงระยะเวลาของการบันทึก | ผลรวมของเวลาของฟังก์ชันเองและเวลาของฟังก์ชันย่อย |
ผู้โทร (โหนดย่อย) | แสดงเวลาที่ใช้ด้วยตนเองทั้งหมดของผู้ถูกเรียกเมื่อผู้เรียกเรียก การใช้แผนผังจากล่างขึ้นบนในรูปที่ 6 เป็นตัวอย่าง เวลาของเมธอด B จะเท่ากับผลรวมของเวลาของเมธอดเอง สำหรับการดำเนินการแต่ละครั้งของเมธอด C เมื่อ B เรียกใช้ | แสดงเวลารวมของบุตรหลานของผู้รับสายเมื่อผู้โทรเรียกใช้ การใช้แผนผังจากล่างขึ้นบนในรูปที่ 6 เป็นตัวอย่าง เวลาของบุตรหลานสำหรับเมธอด B จะเท่ากับผลรวมของ เวลาของบุตรหลานสำหรับการดำเนินการแต่ละครั้งของเมธอด C เมื่อเรียกใช้โดย B | ผลรวมของเวลาของฟังก์ชันเองและเวลาของฟังก์ชันย่อย |
หมายเหตุ: สำหรับการบันทึกที่กำหนด Android Studio จะหยุดรวบรวมข้อมูลใหม่ เมื่อโปรไฟล์เลอร์ถึงขีดจำกัดขนาดไฟล์ (แต่การดำเนินการนี้จะไม่หยุด การบันทึก) โดยปกติแล้ว การดำเนินการนี้จะเกิดขึ้นเร็วกว่ามากเมื่อทำการติดตามที่มีการวัดประสิทธิภาพ เนื่องจากประเภทการติดตามนี้จะรวบรวมข้อมูลได้มากกว่าในเวลาที่สั้นกว่าเมื่อเทียบกับการติดตามแบบสุ่มตัวอย่าง หากคุณขยายเวลาการตรวจสอบเป็น ระยะเวลาของการบันทึกที่เกิดขึ้นหลังจากถึงขีดจำกัด ข้อมูลเวลาใน แผงการติดตามจะไม่เปลี่ยนแปลง (เนื่องจากไม่มีข้อมูลใหม่) นอกจากนี้ แผงการติดตามจะแสดง NaN สำหรับข้อมูลการจับเวลาเมื่อคุณเลือกเฉพาะ ส่วนของการบันทึกที่ไม่มีข้อมูล
ตรวจสอบการติดตามโดยใช้ตารางเหตุการณ์
ตารางเหตุการณ์จะแสดงรายการการเรียกทั้งหมดในเธรดที่เลือกในปัจจุบัน คุณสามารถ จัดเรียงได้โดยคลิกส่วนหัวของคอลัมน์ การเลือกแถวในตาราง จะช่วยให้คุณไปยังไทม์ไลน์ที่เวลาเริ่มต้นและสิ้นสุดของการโทรที่เลือกได้ ซึ่งจะช่วยให้คุณค้นหาเหตุการณ์ในไทม์ไลน์ได้อย่างถูกต้อง
รูปที่ 7 การดูแท็บเหตุการณ์ในแผงการวิเคราะห์
ตรวจสอบเฟรม Callstack
Callstack มีประโยชน์ในการทำความเข้าใจว่าส่วนใดของโค้ดที่ได้รับการดำเนินการ
และเหตุใดจึงมีการเรียกใช้ หากมีการรวบรวมการบันทึกตัวอย่าง Callstack สำหรับโปรแกรม Java/Kotlin
โดยปกติแล้ว Callstack จะไม่เพียงรวมโค้ด Java/Kotlin
แต่ยังรวมเฟรมจากโค้ดเนทีฟ JNI, เครื่องเสมือน Java (เช่น
android::AndroidRuntime::start
) และเคอร์เนลของระบบ
([kernel.kallsyms]+offset
) เนื่องจากโดยปกติแล้วโปรแกรม Java/Kotlin จะ
ดำเนินการผ่านเครื่องเสมือน Java ต้องใช้โค้ดที่มาพร้อมเครื่องเพื่อเรียกใช้
โปรแกรมเองและเพื่อให้โปรแกรมสื่อสารกับระบบและฮาร์ดแวร์ได้
Profiler จะแสดงเฟรมเหล่านี้เพื่อให้มีความแม่นยำ อย่างไรก็ตาม คุณอาจพบหรือไม่พบว่าเฟรมการเรียกเพิ่มเติมเหล่านี้มีประโยชน์ ทั้งนี้ขึ้นอยู่กับ
การตรวจสอบ
Profiler มีวิธีพับเฟรมที่คุณไม่สนใจ เพื่อให้คุณซ่อนข้อมูลที่ไม่เกี่ยวข้องกับการตรวจสอบได้
ในตัวอย่างด้านล่างนี้ Trace ด้านล่างมีเฟรมจำนวนมากที่มีป้ายกำกับ
[kernel.kallsyms]+offset
ซึ่งปัจจุบันไม่มีประโยชน์ต่อการพัฒนา
หากต้องการยุบเฟรมเหล่านี้ให้เหลือเฟรมเดียว ให้เลือกปุ่มยุบเฟรม
จากแถบเครื่องมือ เลือกเส้นทางที่จะยุบ แล้วเลือกปุ่มใช้
เพื่อใช้การเปลี่ยนแปลง ในตัวอย่างนี้ เส้นทางคือ [kernel.kallsyms]
การทำเช่นนี้จะยุบเฟรมที่สอดคล้องกับเส้นทางที่เลือกในทั้งแผงด้านซ้ายและด้านขวา ดังที่แสดงด้านล่าง
ตรวจสอบการติดตามระบบ
เมื่อตรวจสอบการติดตามระบบ คุณจะตรวจสอบเหตุการณ์การติดตามในไทม์ไลน์เธรดเพื่อดูรายละเอียดของเหตุการณ์ที่เกิดขึ้นในแต่ละเธรดได้ วางเคอร์เซอร์เมาส์เหนือเหตุการณ์เพื่อดูชื่อเหตุการณ์และ เวลาที่ใช้ในแต่ละสถานะ คลิกเหตุการณ์เพื่อดูข้อมูลเพิ่มเติมในแผงการวิเคราะห์
ตรวจสอบการติดตามระบบ: แกน CPU
นอกเหนือจากข้อมูลการจัดกำหนดการ CPU แล้ว การติดตามระบบยังรวมถึงความถี่ CPU ต่อคอร์ด้วย ซึ่งจะแสดงปริมาณกิจกรรมในแต่ละแกนและอาจช่วยให้คุณทราบว่าแกนใดเป็น"แกนใหญ่" หรือ "แกนเล็ก" ในโปรเซสเซอร์อุปกรณ์เคลื่อนที่สมัยใหม่
รูปที่ 8 การดูกิจกรรมของ CPU และเหตุการณ์การติดตามสำหรับเธรดการแสดงผล
แผงแกน CPU (ดังที่แสดงในรูปที่ 8) จะแสดงกิจกรรมของเธรดที่กำหนดเวลา ในทุกแกน วางเคอร์เซอร์เมาส์เหนือกิจกรรมของเธรดเพื่อดูว่าเธรดใดที่แกนนี้ทำงานอยู่ ณ เวลาดังกล่าว
ดูข้อมูลเพิ่มเติมเกี่ยวกับการตรวจสอบข้อมูลการติดตามระบบได้ที่ส่วนตรวจสอบปัญหาด้านประสิทธิภาพ UI ของเอกสารประกอบ systrace
ตรวจสอบการติดตามระบบ: ไทม์ไลน์การแสดงผลเฟรม
คุณสามารถตรวจสอบระยะเวลาที่แอปใช้ในการแสดงผลแต่ละเฟรมในเทรดหลักและRenderThread
เพื่อตรวจสอบคอขวดที่ทำให้ UI กระตุกและมีอัตราเฟรมต่ำได้ ดูวิธีใช้การติดตามระบบเพื่อตรวจสอบและช่วยลดอาการ UI Jank ได้ที่การตรวจหา UI Jank
ตรวจสอบการติดตามระบบ: หน่วยความจำของกระบวนการ (RSS)
สำหรับแอปที่ติดตั้งใช้งานในอุปกรณ์ที่ใช้ Android 9 ขึ้นไป ส่วนหน่วยความจำของกระบวนการ (RSS) จะแสดงปริมาณหน่วยความจำจริงที่แอปใช้อยู่ในปัจจุบัน
รูปที่ 9 การดูหน่วยความจำจริงในโปรไฟล์เลอร์
รวม
นี่คือจำนวนหน่วยความจำจริงทั้งหมดที่กระบวนการของคุณกำลังใช้ อยู่ในขณะนี้ ในระบบที่ใช้ Unix ค่านี้เรียกว่า "ขนาดชุดข้อมูลที่อยู่ในหน่วยความจำ" และเป็นการรวมหน่วยความจำทั้งหมดที่ใช้โดยการจัดสรรที่ไม่ระบุชื่อ การแมปไฟล์ และการจัดสรรหน่วยความจำที่ใช้ร่วมกัน
สำหรับนักพัฒนาแอป Windows ขนาดชุดข้อมูลที่อยู่ในหน่วยความจำจะคล้ายกับขนาดชุดข้อมูลที่ใช้งาน
จัดสรรแล้ว
เคาน์เตอร์นี้จะติดตามจำนวนหน่วยความจำจริงที่การจัดสรรหน่วยความจำปกติของ
กระบวนการ' ใช้งานอยู่ในขณะนี้ การจัดสรรเหล่านี้เป็นแบบ
ไม่ระบุตัวตน (ไม่ได้สำรองข้อมูลโดยไฟล์ใดไฟล์หนึ่ง) และเป็นแบบส่วนตัว (ไม่ได้แชร์) ในแอปพลิเคชันส่วนใหญ่
สิ่งเหล่านี้ประกอบด้วยการจัดสรรฮีป (มี malloc
หรือ
new
) และหน่วยความจำสแต็ก เมื่อสลับออกจากหน่วยความจำจริง ระบบจะเขียนการจัดสรรเหล่านี้ลงในไฟล์สวอปของระบบ
การแมปไฟล์
ตัวนับนี้จะติดตามปริมาณหน่วยความจำจริงที่กระบวนการใช้สำหรับการ แมปไฟล์ ซึ่งก็คือหน่วยความจำที่แมปจากไฟล์ไปยังภูมิภาคของหน่วยความจำ โดยตัวจัดการหน่วยความจำ
แชร์
ตัวนับนี้จะติดตามปริมาณหน่วยความจำจริงที่ใช้เพื่อแชร์หน่วยความจำ ระหว่างกระบวนการนี้กับกระบวนการอื่นๆ ในระบบ