ตัวอย่างเหล่านี้แสดงวิธีใช้การติดตามระบบกับ 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
รูปที่ 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 กำลังทำงาน
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- บันทึกเมตริก Macrobenchmark
- การวิเคราะห์และการเพิ่มประสิทธิภาพการเริ่มต้นแอป {:#app-startup-analysis-optimization}