คุณสามารถบันทึกโปรไฟล์ประสิทธิภาพได้หลายประเภทใน Android การรวบรวมโปรไฟล์จะช่วยคุณแก้ไขข้อบกพร่องที่เกี่ยวข้องกับความเร็วในการทำงานของแอป ปริมาณหน่วยความจำที่แอปใช้ ปริมาณพลังงานที่แอปใช้ และอื่นๆ
เอกสารนี้จะอธิบายโปรไฟล์ประเภทที่มีประโยชน์มากที่สุดและเวลาที่ควรใช้โปรไฟล์แต่ละประเภทเพื่อแก้ไขข้อบกพร่องด้านประสิทธิภาพที่พบบ่อย
การติดตามระบบ
การติดตามระบบเป็นโปรไฟล์ที่มีประสิทธิภาพซึ่งมีข้อมูลเกี่ยวกับกระบวนการ เธรด ข้อมูลการกำหนดเวลา การดำเนินการ CPU และงาน รวมถึงเหตุการณ์ที่ระบบหรือผู้ใช้กำหนด
จากมุมมองของแอป ลักษณะของข้อมูลในการติดตามอาจครอบคลุมหลายด้าน เช่น เวลาในการตอบสนอง, Jank, หน่วยความจำ, แบตเตอรี่ และอื่นๆ
การติดตามระบบมีเหตุการณ์ที่ขับเคลื่อนด้วยโค้ดต่อไปนี้ ซึ่งอาจเป็นเหตุการณ์ที่ระบบหรือผู้ใช้กำหนด เหตุการณ์ที่ขับเคลื่อนด้วยโค้ดคือเหตุการณ์ที่ผู้ใช้สามารถทริกเกอร์ผ่านการเรียกฟังก์ชัน
- Trace Slice: แสดงเวลาที่ผ่านไประหว่างจุดต่างๆ ในโค้ด คุณสามารถเพิ่มได้ด้วย
Trace.beginSectionและTrace.endSectionAPIs. - Trace Counter: ค่าตัวเลขที่แสดงเมตริก เช่น ขนาดฮีป คุณสามารถเพิ่ม Trace Counter ได้ด้วย API
Trace.setCounter
การติดตามระบบยังมีเมตริกที่สร้างขึ้นจากการค้นหา PerfettoSQL และใช้เพื่อทำการวิเคราะห์หรือเปรียบเทียบการติดตามได้
เราขอแนะนำให้ใช้การติดตามระบบเพื่อทำงานต่อไปนี้
วิเคราะห์ปัญหาเวลาในการตอบสนอง การติดตามระบบเหมาะอย่างยิ่งสำหรับการค้นหาปัญหาเวลาในการตอบสนองที่เกิดจากความล่าช้า การรอ หรือปัญหาการจัดกำหนดการ โปรไฟล์เลอร์อื่นๆ เช่น โปรไฟล์แบบสุ่ม จะไม่มีข้อมูลการกำหนดเวลาที่การติดตามระบบมี
ค้นหาการคำนวณที่ซ้ำกัน การติดตามสามารถแสดงให้เห็นว่ามีการคำนวณบางอย่างซ้ำหรือไม่ ซึ่งอาจบ่งบอกถึงการดำเนินการที่ไม่จำเป็น
วิเคราะห์ปัญหาการแย่งชิงล็อก ข้อมูลเกี่ยวกับสถานะเธรดและ Slice ที่แสดงเมื่อทรัพยากรถูกบล็อกจะช่วยให้คุณระบุได้ว่าล็อก (เช่น บล็อก
synchronized) ทำให้เกิดความล่าช้าในเส้นทางของผู้ใช้หรือไม่ทำความเข้าใจการทำงานแบบมัลติเธรดในแอป การติดตามจะแสดงมุมมองของหลายเธรด โดยแสดงสถานะของแต่ละเธรดและ Trace Slice ที่ระบบหรือแอปของคุณเพิ่ม มุมมองแบบมัลติเธรดนี้จะช่วยให้คุณเข้าใจว่าเธรดใดทำงานอยู่ หยุดทำงาน หรือกำลังทำงานอะไรอยู่ รวมถึงวิธีที่เธรดโต้ตอบกัน
ทำการวิเคราะห์ประสิทธิภาพที่ซับซ้อน อินเทอร์เฟซผู้ใช้ที่มีประสิทธิภาพและความสามารถในการแสดงข้อมูลประเภทต่างๆ ทำให้การติดตามระบบมีประโยชน์สำหรับการแก้ไขข้อบกพร่องด้านประสิทธิภาพที่หลากหลาย รวมถึงเวลาในการตอบสนอง หน่วยความจำ และการใช้แบตเตอรี่
การติดตามระบบยังรองรับการค้นหาโดยใช้ PerfettoSQL ด้วย ฟีเจอร์ที่มีประสิทธิภาพนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ดึงข้อมูลที่เฉพาะเจาะจง
- เปลี่ยนข้อมูลการติดตามเป็นเมตริกที่กำหนดเอง
- สร้างแทร็กการแก้ไขข้อบกพร่องจากการค้นหาเพื่อให้เห็นภาพสิ่งที่คุณสนใจมากที่สุดใน UI ของ Perfetto ได้ง่ายขึ้น
- ทำการวิเคราะห์ที่ซับซ้อนได้โดยตรงภายใน UI ของ Perfetto
โปรไฟล์ตัวอย่างสแต็ก
โปรไฟล์ตัวอย่างสแต็กทำงานโดยการบันทึกตัวอย่างการดำเนินการโค้ดและจัดเก็บข้อมูลสแต็กการเรียกใช้ในอัตราที่กำหนดขณะที่เทรดกำลังทำงานบน CPU ซึ่งจะให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่โค้ดกำลังทำอยู่ระหว่างการดำเนินการ
เราขอแนะนำให้ใช้ตัวอย่างสแต็กเพื่อทำสิ่งต่อไปนี้
- เพิ่มประสิทธิภาพฮอตสปอต ตัวอย่างสแต็กช่วยระบุส่วนของโค้ดที่มีกิจกรรม CPU จำนวนมาก ซึ่งหมายความว่าเธรดมักอยู่ในสถานะ "กำลังทำงาน"
- ทำความเข้าใจการดำเนินการโค้ด ตัวอย่างสแต็กช่วยให้คุณเข้าใจลักษณะการทำงานโดยรวมของฐานโค้ด
- ระบุโค้ดที่ไม่ควรทำงาน คุณอาจพบสแต็กการเรียกที่ไม่ควรทำงานเลย ซึ่งบ่งบอกถึงโอกาสในการเพิ่มประสิทธิภาพในทันที
ฮีปดัมป์
ฮีปดัมป์ของ Java จะแสดงสแนปชอตของหน่วยความจำฮีปของ Java ในแอป สแนปชอตนี้รวมออบเจ็กต์ทั้งหมดและวิธีที่ออบเจ็กต์อ้างอิงถึงกัน ณ เวลาที่สร้างดัมป์
เราขอแนะนำให้รวบรวมฮีปดัมป์เพื่อทำสิ่งต่อไปนี้
- ค้นพบออบเจ็กต์ที่ซ้ำกัน ฮีปดัมป์จะแสดงจำนวนออบเจ็กต์ที่ใช้งานอยู่ ซึ่งมีประโยชน์สำหรับการติดตามออบเจ็กต์ที่ซ้ำกัน นอกจากนี้ยังมีการอ้างอิงออบเจ็กต์ ซึ่งช่วยให้คุณระบุตำแหน่งโค้ดที่สร้างออบเจ็กต์ได้
- ค้นหาหน่วยความจำรั่ว ฮีปดัมป์สามารถแสดงหน่วยความจำที่ไม่ควรใช้งานอีกต่อไปเมื่อสร้างดัมป์ ซึ่งบ่งบอกถึงหน่วยความจำรั่วที่อาจเกิดขึ้น
- ระบุออบเจ็กต์ที่เพิ่มประสิทธิภาพได้ ฮีปดัมป์จะแสดงออบเจ็กต์ที่ใช้หน่วยความจำจำนวนมากและจำนวนออบเจ็กต์ ซึ่งช่วยระบุรูปแบบการใช้หน่วยความจำที่ไม่มีประสิทธิภาพ
โปรไฟล์ฮีป
โปรไฟล์ฮีปมีทั้งเวอร์ชันเนทีฟและ Java และเหมาะอย่างยิ่งสำหรับการแก้ไขข้อบกพร่องด้านหน่วยความจำ โปรไฟล์ฮีปคล้ายกับตัวอย่างสแต็กการเรียกใช้ แต่จะสุ่มตัวอย่างเมื่อมีการจัดสรรหน่วยความจำแทนที่จะวัดรอบ CPU
เราขอแนะนำให้ใช้โปรไฟล์ฮีปเพื่อทำสิ่งต่อไปนี้
- ลดการเปลี่ยนแปลงหน่วยความจำ โปรไฟล์ฮีปจะให้ตัวอย่างที่มีตำแหน่งโค้ดสำหรับการจัดสรรหน่วยความจำ ซึ่งจะช่วยคุณระบุพื้นที่ที่สร้างออบเจ็กต์ชั่วคราวจำนวนมาก ซึ่งอาจทำให้เกิดการเก็บกวาดหน่วยความจำ (GC) บ่อยครั้งในแอป
- ค้นพบหน่วยความจำรั่ว คุณสามารถใช้โปรไฟล์ฮีปร่วมกับโปรไฟล์หน่วยความจำอื่นๆ เพื่อวิเคราะห์และแก้ไขหน่วยความจำรั่วได้ โปรไฟล์ฮีปจะช่วยคุณระบุตำแหน่งที่จัดสรรหน่วยความจำมากกว่าที่คาดไว้มาก
รวมโปรไฟล์
โดยส่วนใหญ่แล้ว คุณจะวิเคราะห์ประสิทธิภาพโดยใช้โปรไฟล์เดียว อย่างไรก็ตาม การรวบรวมโปรไฟล์หลายรายการหรือโปรไฟล์เดียวที่รวมกันอาจให้ภาพที่สมบูรณ์ยิ่งขึ้นและช่วยวิเคราะห์ปัญหาที่ซับซ้อนซึ่งโปรไฟล์เดียวไม่สามารถทำได้
พิจารณาสถานการณ์ต่อไปนี้ที่การรวมโปรไฟล์เป็นประโยชน์
สถานการณ์ที่ 1: การตรวจสอบโค้ดที่ไม่ได้ใช้เครื่องมือ การติดตามระบบอาจแสดงเวลาในการตอบสนองสำหรับการดำเนินการที่คุณใช้เครื่องมือไปแล้ว อย่างไรก็ตาม คุณอาจต้องการข้อมูลเพิ่มเติมเกี่ยวกับส่วนของโค้ดที่ไม่ได้ใช้เครื่องมือซึ่งทำงานในช่วงเวลาดังกล่าว หากต้องการตรวจสอบ ให้ใช้โปรไฟล์สแต็กการเรียกใช้เพื่อทำความเข้าใจโค้ดที่ดำเนินการ จากนั้นข้อมูลนี้จะช่วยคุณปรับปรุงการติดตามโดยการเพิ่ม Trace Slice
สถานการณ์ที่ 2: การวิเคราะห์หน่วยความจำรั่วและการเก็บกวาดหน่วยความจำ ลองจินตนาการว่าการติดตามระบบแสดงหน่วยความจำฮีปของ Java ที่เพิ่มขึ้นอย่างต่อเนื่องเนื่องจากการจัดสรร ซึ่งทริกเกอร์การเก็บกวาดหน่วยความจำ (GC) บ่อยครั้ง หากต้องการทำความเข้าใจออบเจ็กต์ที่จัดสรร ให้ใช้โปรไฟล์ฮีปหรือฮีปดัมป์ แนวทางที่รวมกันนี้จะช่วยคุณระบุวิธีลดการใช้งานหน่วยความจำ ตัวอย่างเช่น การลดการจัดสรรที่สิ้นเปลืองหรือเพิ่มประสิทธิภาพได้โดยใช้การแคชอาจป้องกันไม่ให้เกิด GC