ประเภทโปรไฟล์และเวลาที่แต่ละประเภทมีประโยชน์

คุณบันทึกโปรไฟล์ประสิทธิภาพได้หลายประเภทใน Android การรวบรวมโปรไฟล์จะช่วยคุณแก้ไขข้อบกพร่องที่เกี่ยวข้องกับความเร็วในการทำงานของแอป ปริมาณหน่วยความจำที่ใช้ ปริมาณการใช้พลังงาน และอื่นๆ

เอกสารนี้อธิบายโปรไฟล์ประเภทที่มีประโยชน์มากที่สุดและเวลาที่ควรใช้แต่ละประเภท เพื่อแก้ไขปัญหาด้านประสิทธิภาพที่พบบ่อย

การติดตามระบบ

ตัวอย่างการติดตามระบบ
รูปที่ 1: ตัวอย่างการติดตามของระบบ

การติดตามระบบคือโปรไฟล์ที่มีประสิทธิภาพซึ่งมีข้อมูลเกี่ยวกับกระบวนการ เธรด ข้อมูลเวลา การดำเนินการของ CPU และงาน รวมถึงเหตุการณ์ที่ระบบหรือผู้ใช้กำหนด

จากมุมมองของแอป ลักษณะของข้อมูลในร่องรอยอาจครอบคลุมหลายด้าน เช่น เวลาในการตอบสนอง ความหน่วง หน่วยความจำ แบตเตอรี่ และอื่นๆ

การติดตามระบบประกอบด้วยเหตุการณ์ที่ขับเคลื่อนด้วยโค้ดต่อไปนี้ ซึ่งอาจเป็นระบบ หรือผู้ใช้กำหนด เหตุการณ์ที่ขับเคลื่อนด้วยโค้ดคือเหตุการณ์ที่ผู้ใช้เรียกใช้ผ่านการเรียกฟังก์ชันได้

  • Trace slices: แสดงเวลาที่อยู่ระหว่างจุดต่างๆ ในโค้ด โดยสามารถเพิ่มได้ด้วย Trace.beginSection และ Trace.endSection API
  • ตัวนับการติดตาม: ค่าตัวเลขที่แสดงเมตริก เช่น ขนาดฮีป โดยเพิ่มได้ด้วย Trace.setCounter API

การติดตามระบบยังมีเมตริกที่สร้างได้จากการค้นหา PerfettoSQL และใช้เพื่อทำการวิเคราะห์หรือเปรียบเทียบการติดตามได้

เราขอแนะนำให้ใช้การติดตามระบบเพื่อทำงานต่อไปนี้

  • วิเคราะห์ปัญหาเวลาในการตอบสนอง การติดตามระบบเหมาะอย่างยิ่งสำหรับการค้นหาปัญหาเวลาในการตอบสนองที่เกิดจากความล่าช้า การรอ หรือปัญหาการจัดกำหนดการ Profiler อื่นๆ เช่น โปรไฟล์ที่อิงตามตัวอย่าง จะไม่ให้ข้อมูลเวลา ที่การติดตามระบบให้

  • ค้นหาการคำนวณที่ซ้ำกัน การติดตามจะแสดงให้เห็นว่ามีการคำนวณบางอย่าง ซ้ำหรือไม่ ซึ่งอาจบ่งบอกถึงการดำเนินการที่ไม่จำเป็น

  • วิเคราะห์ปัญหาการแย่งชิงล็อก ข้อมูลเกี่ยวกับสถานะของเธรด และสไลซ์ที่แสดงเมื่อมีการบล็อกทรัพยากรจะช่วยให้คุณระบุได้ว่าล็อก (เช่น บล็อก synchronized) ทำให้เกิดความล่าช้าในเส้นทางของผู้ใช้หรือไม่

  • ทําความเข้าใจการทำงานแบบหลายเธรดในแอป Trace จะแสดงมุมมองของหลายเธรด โดยแสดงสถานะของแต่ละเธรดและ Trace Slice ที่ระบบหรือแอปของคุณเพิ่ม มุมมองแบบหลายเธรดนี้ช่วยให้คุณเข้าใจว่าเธรดใดที่ใช้งานอยู่ เธรดใดที่ไม่ได้ใช้งาน หรือเธรดใดที่กำลังทำงานอยู่และมีการโต้ตอบกันอย่างไร

  • ทำการวิเคราะห์ประสิทธิภาพที่ซับซ้อน อินเทอร์เฟซผู้ใช้ที่มีประสิทธิภาพและความสามารถในการแสดงข้อมูลประเภทต่างๆ ทำให้การติดตามระบบมีประโยชน์ในการแก้ไขข้อบกพร่องของปัญหาด้านประสิทธิภาพที่หลากหลาย ซึ่งรวมถึงเวลาในการตอบสนอง หน่วยความจำ และการใช้งานแบตเตอรี่

การติดตามระบบยังรองรับการค้นหาโดยใช้ PerfettoSQL ด้วย ฟีเจอร์ที่มีประสิทธิภาพนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้

  • ดึงข้อมูลที่เฉพาะเจาะจง
  • เปลี่ยนข้อมูลการติดตามเป็นเมตริกที่กำหนดเอง
  • สร้างแทร็กการแก้ไขข้อบกพร่องจากคําค้นหาเพื่อให้เห็นภาพสิ่งที่คุณสนใจมากที่สุดใน UI ของ Perfetto ได้ง่ายขึ้น
  • ทำการวิเคราะห์ที่ซับซ้อนได้โดยตรงภายใน UI ของ Perfetto

โปรไฟล์ตัวอย่างสแต็ก

ตัวอย่างโปรไฟล์
ตัวอย่างสแต็ก
รูปที่ 2: ตัวอย่างโปรไฟล์ตัวอย่างสแต็ก

โปรไฟล์ตัวอย่างแบบซ้อนจะทำงานโดยการบันทึกตัวอย่างการเรียกใช้โค้ดและจัดเก็บ ข้อมูลสแต็กการเรียกที่อัตราที่กำหนดขณะที่เธรดกำลังเรียกใช้ งานใน CPU ซึ่งจะให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่โค้ดทำในระหว่างการดำเนินการ

เราขอแนะนำให้ใช้ตัวอย่างสแต็กเพื่อทำสิ่งต่อไปนี้

  • เพิ่มประสิทธิภาพฮอตสปอต ตัวอย่างสแต็กช่วยระบุส่วนของโค้ดที่มีกิจกรรม CPU จำนวนมาก ซึ่งหมายความว่าเธรดมักจะอยู่ในสถานะ "กำลังทำงาน"
  • ทำความเข้าใจการเรียกใช้โค้ด ตัวอย่างสแต็กช่วยให้คุณเข้าใจ ลักษณะการทำงานโดยรวมของฐานของโค้ด
  • ระบุโค้ดที่ไม่ควรเรียกใช้ คุณอาจเห็นสแต็กการเรียกใช้ที่ไม่ควรทำงานเลย ซึ่งเป็นโอกาสในการเพิ่มประสิทธิภาพในทันที

ฮีปดัมป์

ตัวอย่างฮีปดัมป์
รูปที่ 3: ตัวอย่างฮีปดัมป์

การทิ้งฮีปของ Java จะแสดงภาพรวมของหน่วยความจำฮีปของ Java ในแอป ภาพรวมนี้ ประกอบด้วยออบเจ็กต์ทั้งหมดและวิธีที่ออบเจ็กต์อ้างอิงถึงกัน ณ เวลาที่ทำการดัมพ์

เราขอแนะนำให้รวบรวม Heap Dump เพื่อทำสิ่งต่อไปนี้

  • ค้นหาออบเจ็กต์ที่ซ้ำกัน การดัมพ์ฮีปจะแสดงจำนวนออบเจ็กต์ที่ใช้งานอยู่ ซึ่งมีประโยชน์ในการติดตามออบเจ็กต์ที่ซ้ำกัน นอกจากนี้ยังให้ข้อมูลอ้างอิงออบเจ็กต์ ซึ่งช่วยให้คุณระบุตำแหน่งโค้ดที่สร้างออบเจ็กต์ได้
  • ค้นหาหน่วยความจำรั่ว การดัมพ์ฮีปสามารถแสดงหน่วยความจำที่ควรจะไม่ได้ใช้งานอีกต่อไป เมื่อทำการดัมพ์ ซึ่งบ่งบอกถึงการรั่วไหลของหน่วยความจำที่อาจเกิดขึ้น
  • ระบุออบเจ็กต์ที่เพิ่มประสิทธิภาพได้ การแสดงออบเจ็กต์ที่ใช้หน่วยความจำจำนวนมากและจำนวนของออบเจ็กต์เหล่านั้นจะช่วยให้ Heap Dump ระบุรูปแบบการใช้หน่วยความจำที่ไม่มีประสิทธิภาพได้

โปรไฟล์ฮีป

ตัวอย่างโปรไฟล์ฮีป
รูปที่ 4: ตัวอย่างโปรไฟล์ฮีป

โปรไฟล์ฮีปมีทั้งเวอร์ชันเนทีฟและ Java และเหมาะอย่างยิ่งสำหรับ การแก้ไขข้อบกพร่องเกี่ยวกับปัญหาหน่วยความจำ ซึ่งคล้ายกับตัวอย่างสแต็กการเรียก แต่จะสุ่มตัวอย่างเมื่อมีการจัดสรรหน่วยความจำแทนที่จะวัดรอบ CPU

เราขอแนะนำให้ใช้โปรไฟล์ฮีปเพื่อทำสิ่งต่อไปนี้

  • ลดการเสียหน่วยความจำ โปรไฟล์ฮีปจะให้ตัวอย่างที่มีตำแหน่งโค้ด สำหรับการจัดสรรหน่วยความจำ ซึ่งจะช่วยให้คุณระบุส่วนที่สร้างออบเจ็กต์ชั่วคราวจำนวนมาก ซึ่งอาจทำให้เกิดการเก็บขยะ (GC) ในแอปบ่อยครั้ง
  • ตรวจหาหน่วยความจำรั่วไหล โปรไฟล์ฮีปสามารถใช้ร่วมกับโปรไฟล์หน่วยความจำอื่นๆ เพื่อวินิจฉัยและแก้ไขหน่วยความจำรั่วไหล ซึ่งจะช่วยให้คุณระบุตำแหน่งที่จัดสรรหน่วยความจำมากกว่าที่คาดไว้มาก

รวมโปรไฟล์

โดยส่วนใหญ่แล้ว คุณจะวิเคราะห์ประสิทธิภาพโดยใช้โปรไฟล์เดียว อย่างไรก็ตาม การรวบรวมโปรไฟล์หลายรายการหรือโปรไฟล์รวมรายการเดียวมักจะให้ภาพที่สมบูรณ์ยิ่งขึ้นและช่วยวินิจฉัยปัญหาที่ซับซ้อนซึ่งโปรไฟล์เดียวไม่สามารถทำได้

ลองพิจารณาสถานการณ์ต่อไปนี้ที่การรวมโปรไฟล์จะเป็นประโยชน์

  • สถานการณ์ที่ 1: การตรวจสอบโค้ดที่ไม่ได้ใช้เครื่องมือ การติดตามระบบอาจแสดงเวลาในการตอบสนอง สำหรับการดำเนินการที่คุณได้ติดตั้งเครื่องมือไว้แล้ว อย่างไรก็ตาม คุณอาจต้องมี ข้อมูลเพิ่มเติมเกี่ยวกับส่วนที่ไม่ได้วัดผลของโค้ดที่ทํางานในช่วงเวลาดังกล่าว หากต้องการตรวจสอบ ให้ใช้โปรไฟล์สแต็กการเรียกเพื่อทำความเข้าใจ โค้ดที่ดำเนินการ จากนั้นข้อมูลนี้จะช่วยให้คุณปรับปรุงการติดตามได้โดย เพิ่ม Slice การติดตาม

  • สถานการณ์ที่ 2: การวิเคราะห์หน่วยความจำรั่วและการเก็บขยะ ลองนึกภาพ การติดตามระบบที่แสดงการเพิ่มขึ้นอย่างต่อเนื่องของหน่วยความจำฮีป Java เนื่องจากการ จัดสรร ซึ่งทำให้เกิดการเก็บขยะ (GC) บ่อยครั้ง หากต้องการทำความเข้าใจออบเจ็กต์ที่จัดสรร ให้ใช้โปรไฟล์ฮีปหรือฮีปดัมพ์ แนวทาง ร่วมนี้ช่วยให้คุณระบุวิธีลดการใช้หน่วยความจำได้ เช่น การลดการจัดสรรที่สิ้นเปลืองหรือเพิ่มประสิทธิภาพได้โดยใช้แคชอาจป้องกันไม่ให้เกิด GC