ตัวอย่างการวัดและวิเคราะห์ประสิทธิภาพ

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

การแก้ไขข้อบกพร่องการเริ่มต้นแอปโดยใช้ Systrace

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

การใช้ Systrace หรือ Perfetto

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้งาน Systrace ขั้นพื้นฐานได้ในวิดีโอต่อไปนี้ การแก้ไขข้อบกพร่องของประสิทธิภาพแอปพลิเคชัน

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

ขั้นตอนการเริ่มต้นแอปมีดังนี้

  • เริ่มกระบวนการ
  • เริ่มต้นออบเจ็กต์แอปพลิเคชันทั่วไป
  • สร้างและเริ่มต้นกิจกรรม
  • ขยายเลย์เอาต์
  • วาดเฟรมแรก

ประเภทสตาร์ทอัพมีขั้นตอนต่อไปนี้

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

เราขอแนะนำให้บันทึก Systrace โดยใช้แอปการติดตามระบบในอุปกรณ์ที่มีอยู่ในตัวเลือกสำหรับนักพัฒนาแอป หากต้องการใช้เครื่องมือบรรทัดคำสั่ง คุณสามารถใช้ Perfetto กับ Android 10 (API ระดับ 29) ขึ้นไป ส่วนอุปกรณ์ ในเวอร์ชันก่อนหน้าควรใช้ systrace

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

หากเป็นไปได้ เราขอแนะนำให้คุณใส่การเรียก reportFullyDrawn (พร้อมใช้งานใน Android 10 ขึ้นไป) เมื่อการเริ่มต้นเสร็จสมบูรณ์จากมุมมองของแอปพลิเคชัน

สิ่งที่คุณควรพิจารณาในข้อมูลการติดตามระบบเหล่านี้มีดังนี้

ตรวจสอบการช่วงชิง
รูปที่ 1 การแข่งขันสำหรับทรัพยากรที่ได้รับการป้องกันโดยจอภาพอาจทำให้การเริ่มต้นแอปเกิดความล่าช้าอย่างมาก

ธุรกรรมการผูกแบบซิงโครนัส
รูปที่ 2 มองหาธุรกรรมที่ไม่จำเป็นในเส้นทางสำคัญของแอปพลิเคชัน

การเก็บขยะพร้อมกัน
รูปที่ 3 การเก็บขยะพร้อมกันเป็นเรื่องปกติและมีผลกระทบค่อนข้างต่ำ แต่หากพบปัญหานี้บ่อยครั้ง ให้ลองตรวจสอบด้วยเครื่องมือสร้างโปรไฟล์หน่วยความจำของ Android Studio

I/O เมื่อเริ่มต้นระบบ
รูปที่ 4 ตรวจสอบ I/O ระหว่างการเริ่มต้นระบบและมองหาการหยุดทำงานเป็นเวลานาน

ในรูปที่ 4 โปรดทราบว่ากระบวนการอื่นๆ ที่ดำเนินการ I/O พร้อมกันอาจทำให้เกิดการแย่งชิง I/O ดังนั้นโปรดตรวจสอบว่ากระบวนการอื่นๆ ไม่ได้ทำงานอยู่

กิจกรรมที่สำคัญในเธรดอื่นๆ อาจรบกวนเธรด UI ดังนั้น โปรดระวังการทำงานในเบื้องหลังระหว่างการเริ่มต้น โปรดทราบว่าอุปกรณ์อาจมีการกำหนดค่า CPU ที่แตกต่างกัน ดังนั้นจำนวนเธรดที่สามารถทำงานแบบขนานได้จึงอาจแตกต่างกันไปในแต่ละอุปกรณ์

นอกจากนี้ โปรดดูคำแนะนำเกี่ยวกับแหล่งที่มาทั่วไปของ Jank

ใช้โปรไฟล์หน่วยความจำของ Android Studio

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

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

การสร้างโปรไฟล์หน่วยความจำของแอปแบ่งออกเป็นขั้นตอนต่อไปนี้

1. ตรวจหาปัญหาเกี่ยวกับหน่วยความจำ

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

การเพิ่มจำนวนออบเจ็กต์
รูปที่ 5 โปรไฟล์หน่วยความจำแสดงการจัดสรรออบเจ็กต์ที่เพิ่มขึ้น เมื่อเวลาผ่านไป

การเก็บขยะ
รูปที่ 6 โปรไฟล์หน่วยความจำที่แสดงเหตุการณ์การเก็บขยะ{.:image-caption}

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

2. วิเคราะห์จุดที่เกิดแรงกดดันด้านหน่วยความจำ

เลือกช่วงในไทม์ไลน์เพื่อแสดงภาพทั้งการจัดสรรและขนาดแบบตื้น

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

คุณจัดเรียงข้อมูลนี้ได้หลายวิธี ส่วนต่อไปนี้จะแสดง ตัวอย่างวิธีที่มุมมองแต่ละมุมมองช่วยวิเคราะห์ปัญหา

จัดเรียงตามชั้นเรียน

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

ตัวอย่างเช่น สมมติว่าคุณเห็นแอปสร้างออบเจ็กต์ 2,000 รายการของคลาสที่ชื่อ "Vertex" ทุกวินาที ซึ่งจะเพิ่มจำนวนการจัดสรรครั้งละ 2,000 ทุกวินาที และคุณจะเห็นการจัดสรรนี้เมื่อจัดเรียงตามชั้นเรียน ควรนำออบเจ็กต์ดังกล่าวมาใช้ซ้ำเพื่อหลีกเลี่ยงการสร้างขยะไหม หากคำตอบคือใช่ คุณอาจต้อง ใช้พูลหน่วยความจำ

จัดเรียงตาม Callstack

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

ขนาดระดับออบเจ็กต์เทียบกับขนาดที่คงไว้

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

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

การถ่ายโอนข้อมูลหน่วยความจำทั้งหมด
รูปที่ 8 คุณสร้างการทิ้งหน่วยความจำได้ทุกเมื่อโดยคลิกปุ่มทิ้งฮีป Java ในแถบเครื่องมือของเครื่องมือสร้างโปรไฟล์หน่วยความจำ

เพิ่มเป็นคอลัมน์
รูปที่ 9 การสร้างการดัมพ์หน่วยความจำจะแสดงคอลัมน์ที่แสดงการจัดสรรออบเจ็กต์ ในฮีปนั้น

3. วัดผลกระทบของการเพิ่มประสิทธิภาพ

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

ผลกระทบขั้นสุดท้ายของการปรับปรุงหน่วยความจำ เช่น การปรับปรุงเหล่านี้ มีดังนี้

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