กำไร:
- โดยเริ่มแรกทำโปรไฟล์และวัดคอขวดที่แท้จริง ทำการเพิ่มประสิทธิภาพโดยอาศัยข้อมูลมากกว่าการคาดเดา และให้เอาท์พุตโปรไฟล์ตีความโดยปัญญาประดิษฐ์
- ความสามารถในการกำหนดเป้าหมายการดำเนินการที่แพงที่สุดในแง่ของเวลาเริ่มต้น ความคล่อง หน่วยความจำ และแบตเตอรี่ และลบงานหนักออกจากเธรดหลัก
- ความสามารถในการจัดการต้นทุนแบตเตอรี่และโปรเซสเซอร์ของความสามารถของ AI เช่น รุ่นบนอุปกรณ์และการโทรบนคลาวด์ผ่านการสุ่มตัวอย่างและการประมวลผลเป็นชุด
ผู้ใช้มือถือใจร้อน หากแอปเปิดช้า ค้างขณะเลื่อน หรือแบตเตอรี่หมดเร็ว ผู้ใช้จะลบแอปและให้คะแนนดาวในร้านค้า ประสิทธิภาพและประสิทธิภาพของแบตเตอรี่เป็นเรื่องของการอยู่รอดของแอพมือถือ มันส่งผลโดยตรงต่อทั้งความพึงพอใจของผู้ใช้และการจัดอันดับร้านค้า AI เป็นตัวช่วยที่มีประสิทธิภาพในการตรวจจับปัญหาคอขวดของประสิทธิภาพ (คอขวด) การตีความผลการวัด และแนะนำการปรับให้เหมาะสม แต่กฎทองยังคงอยู่: วัดก่อน ปรับให้เหมาะสมในภายหลัง ในหน่วยนี้ เราจะเรียนรู้วิธีแก้ปัญหาประสิทธิภาพและแบตเตอรี่ด้วยวิธีที่อิงข้อมูลด้วย AI ปัญหาที่สำคัญอย่างยิ่งคือการจัดการผลกระทบต่อแบตเตอรี่และประสิทธิภาพของความสามารถ AI ที่เราเพิ่มในหน่วยก่อนหน้า (รุ่นบนอุปกรณ์, การโทรบนคลาวด์)
การเพิ่มประสิทธิภาพโดยไม่ต้องวัดผล
ข้อผิดพลาดที่ใหญ่ที่สุดของนักพัฒนาที่ไม่มีประสบการณ์คือการเพิ่มประสิทธิภาพเชิงคาดการณ์: การเสียเวลาพูดว่า "อันนี้ต้องช้า" คอขวดที่แท้จริงมักจะอยู่ในสถานที่ที่ไม่คาดคิดเสมอ ก่อนอื่นให้ทำโปรไฟล์ (การทำโปรไฟล์ — การวัดว่าส่วนใดของแอปพลิเคชันกินเวลา/หน่วยความจำ/แบตเตอรี่มากน้อยเพียงใด) Android Studio Profiler และ Xcode Instruments มีไว้สำหรับงานนี้ การให้ข้อมูลการวัดแก่ AI ช่วยเพิ่มความเร็วในการตีความ แต่หากไม่มีการวัดผล การบอก AI ว่า "แอปพลิเคชันของฉันช้า เร่งความเร็ว" หมายถึงการคาดการณ์แบบสุ่มสี่สุ่มห้า
สี่แกนหลักของประสิทธิภาพคือ:
แกน
อาการ
สาเหตุทั่วไป
เวลาเริ่มต้น
แอปพลิเคชันเปิดช้า
งานหนักบนเธรดหลัก
ความคล่องแคล่ว (jank)
เลื่อนค้าง
การประมวลผลที่ยาวนาน การวาดใหม่โดยไม่จำเป็นในเธรด UI
หน่วยความจำ
บวมยุบ
รั่ว, รูปภาพขนาดใหญ่, แคชไม่สามารถควบคุมได้
แบตเตอรี่/ความร้อน
การพุ่งออกมาอย่างรวดเร็ว
ตำแหน่งต่อเนื่อง เครือข่าย เซ็นเซอร์ งานเบื้องหลัง
เคล็ดลับ: เมื่อถาม AI เกี่ยวกับปัญหาด้านประสิทธิภาพ ให้ระบุเอาต์พุตโปรไฟล์ (ฟังก์ชันใดใช้เวลานานเท่าใด, กราฟหน่วยความจำ) ข้อมูลหนักเช่น “ฟังก์ชันนั้นใช้เวลา 30 มิลลิวินาทีต่อเฟรม” ช่วยให้ AI สามารถมุ่งเน้นไปที่คอขวดที่แท้จริง วลีที่เป็นอัตนัย เช่น "ช้า" จะให้คำตอบทั่วไปและไม่มีประโยชน์
ต้นทุนแบตเตอรี่ของความสามารถ AI
คุณสมบัติ AI ที่เราเพิ่มในโมดูลนี้มีประสิทธิภาพ แต่ไม่ฟรี การแยกรุ่นในอุปกรณ์จะทำให้โปรเซสเซอร์และแบตเตอรี่ตึงเครียด การจดจำรูปภาพที่ทำงานอย่างต่อเนื่อง (เช่น การประมวลผลกล้องแต่ละเฟรม) จะทำให้โทรศัพท์ร้อนขึ้นและแบตเตอรี่หมดภายในไม่กี่นาที ในทางกลับกัน การโทรของ Cloud AI จะกินแบตเตอรี่โดยเปิดวิทยุเครือข่าย (เสาอากาศที่ส่งและรับข้อมูล) ไว้ตลอดเวลา วิธีแก้ไข: เรียกใช้โมเดลในอุปกรณ์เมื่อจำเป็นเท่านั้น สุ่มตัวอย่างกล้องสองสามครั้งต่อวินาทีแทนที่จะเป็นทุกเฟรม ส่งคำขอบนคลาวด์เป็นชุด ทำการยกของหนักในขณะที่อุปกรณ์กำลังชาร์จหรือไม่ได้ใช้งาน
ข้อควรระวัง: คุณสมบัติ AI ที่ทำงานอย่างต่อเนื่อง (การแปลสด การจดจำวัตถุอย่างต่อเนื่อง) อาจทำให้แบตเตอรี่หมดเร็วมาก ทำให้อุปกรณ์ร้อนขึ้น และอาจถูกควบคุมโดยระบบ คุณลักษณะที่ทำให้ผู้ใช้รู้สึกว่าต้นทุนนี้ถูกลบไปแล้ว ฉันมักจะถาม AI เสมอว่า "ฉันจะทำให้ฟีเจอร์นี้เป็นมิตรกับแบตเตอรี่ได้อย่างไร" ฝากคำถามด้วย.
ขั้นตอนของการเพิ่มประสิทธิภาพ
- วัด. ค้นหาคอขวดที่แท้จริงด้วย Profiler อย่าเดา
- เลือกปัญหาที่ใหญ่ที่สุด อย่าไล่ตามการปรับปรุง 1%; มุ่งสู่การทำธุรกรรมที่แพงที่สุด
- ถาม AI ด้วยข้อมูล ขอคำแนะนำในการเพิ่มประสิทธิภาพด้วยเอาต์พุตโปรไฟล์ + รหัสที่เกี่ยวข้อง
- นำไปใช้และวัดอีกครั้ง การปรับปรุงมีจริงหรือไม่? เบอร์ตกมั้ย?
- การควบคุมการถดถอย การเพิ่มประสิทธิภาพทำลายสิ่งใดหรือไม่? ทำซ้ำการทดสอบการมองเห็นและการทำงาน
มินิเคสสามอัน
กรณีที่ 1 — ค้นหาผิดที่ ทีมหนึ่งคิดว่ารายการค้างและแก้ไขโค้ดการเลื่อนเป็นเวลาหลายสัปดาห์โดยไม่เกิดประโยชน์ เมื่อพวกเขานำโปรไฟล์และป้อนข้อมูลไปยัง AI ปรากฎว่าคอขวดที่แท้จริงคือรูปภาพที่ถูกโหลดซ้ำผ่านเครือข่ายในแต่ละแถว เมื่อเพิ่มแคชภาพ ความคล่องแคล่วเพิ่มขึ้นจาก 42 FPS เป็น 60 FPS บทเรียน: การวัดผลหลีกเลี่ยงสัปดาห์แห่งความพยายามอันไร้ประโยชน์
กรณีที่ 2 — คุณสมบัติสัตว์ประหลาดแบตเตอรี่ แอปแปลเพิ่มการแปลข้อความสดด้วยกล้อง ผู้ใช้บ่นว่า "โทรศัพท์ร้อนขึ้นใน 15 นาที และแบตเตอรี่ 30% หมด" เมื่อปรึกษา AI พบว่ากล้องประมวลผลได้ 30 เฟรมต่อวินาที เมื่อลดขนาดลงเหลือ 5 เฟรมและผลลัพธ์ได้รับการอัปเดตห่างกัน 2-3 เฟรม ปริมาณการใช้แบตเตอรี่ลดลงเหลือ 1 ใน 3 และคุณภาพก็ไม่สังเกตเห็นได้ชัดเจน บทเรียน: ตั้งค่า AI ด้วยตาแบตเตอรี่เสมอ
กรณีที่ 3 — การโจมตีช้า แอปเปิดได้ใน 4.5 วินาที; ผู้ใช้ 20% ออกเมื่อเริ่มต้นระบบ โปรไฟล์แสดงให้เห็นว่างานเริ่มแรกทั้งหมด (การวิเคราะห์ การโหลดข้อมูล การเตรียมแบบจำลอง) ดำเนินการตามลำดับบนเธรดหลัก ด้วยข้อเสนอของ AI สิ่งเหล่านี้จึงถูกเลื่อนออกไปและวางไว้ด้านหลัง เวลาเปิดลดลงเหลือ 1.3 วินาที และอัตราการละทิ้งลดลงครึ่งหนึ่ง บทเรียน: ทำงานที่จำเป็นเท่านั้นในช่วงเริ่มต้น
พรอมต์อ่อน / พรอมต์แข็งแกร่ง
ข้อความเตือนที่อ่อนแอ: "แอปของฉันช้า โปรดเร่งความเร็ว"
ข้อความแจ้งที่มีประสิทธิภาพ: "การเลื่อนรายการติดขัด (jank) ในแอปพลิเคชัน Android ของฉัน ข้อมูลตัวสร้างโปรไฟล์: bindImageView ใช้เวลา 28 มิลลิวินาทีในแต่ละเฟรม รูปภาพจะถูกโหลดจากเครือข่ายในแต่ละครั้ง ไม่มีแคช รหัสที่เกี่ยวข้อง: [รหัสอะแดปเตอร์ RecyclerView] แนะนำ 3 การเพิ่มประสิทธิภาพที่มีประสิทธิภาพสูงสุดตามลำดับผลกระทบ ระบุการได้รับที่คาดหวังและผลข้างเคียงที่เป็นไปได้สำหรับแต่ละรายการ จัดลำดับความสำคัญของโซลูชันที่ไม่ลดคุณภาพของภาพ"
เทมเพลตที่คัดลอกได้
เทมเพลตการวิเคราะห์คอขวด: "ตีความข้อมูลโปรไฟล์ต่อไปนี้และค้นหาการดำเนินการที่แพงที่สุด 3 รายการ: [เอาต์พุตของโปรไฟล์] เสนอสาเหตุที่เป็นไปได้และการปรับให้เหมาะสมอย่างเป็นรูปธรรมสำหรับแต่ละรายการ ให้ผลกระทบสูงสุดก่อน"
เทมเพลตการเพิ่มประสิทธิภาพแบตเตอรี่: "ฟีเจอร์นี้จะทำให้แบตเตอรี่หมดอย่างรวดเร็ว: [ฟีเจอร์ เช่น ตำแหน่งถาวร] ทำให้เป็นมิตรกับแบตเตอรี่: - ลดความถี่ในการสุ่มตัวอย่าง - การจำกัดในเบื้องหลัง - การประมวลผลเป็นชุด - เรียกใช้เมื่อจำเป็นเท่านั้น จัดเรียงโซลูชันโดยไม่รบกวนประสบการณ์ผู้ใช้ [รหัส]"
เทมเพลตการเร่งความเร็วการเริ่มต้น: "เร่งความเร็วการเริ่มต้นแอปพลิเคชัน สิ่งที่กำลังทำเมื่อเริ่มต้นระบบ: [รายการ] สิ่งใดที่สามารถเลื่อนออกไป พื้นหลัง หรือโหลดแบบขี้เกียจได้ แยกสิ่งสำคัญออก [รหัส]"
เทมเพลตต้นทุนฟีเจอร์ AI: "ประเมินประสิทธิภาพและต้นทุนแบตเตอรี่ของฟีเจอร์ [รุ่นบนอุปกรณ์ / การโทรบนคลาวด์] ที่ฉันเพิ่ม แสดงรายการเมตริกที่ฉันควรวัดและกลยุทธ์เพื่อลดต้นทุน [รหัส]"
ข้อผิดพลาดทั่วไป
- การเพิ่มประสิทธิภาพโดยไม่ต้องวัดผล คอขวดที่แท้จริงมักจะอยู่ในตำแหน่งที่แตกต่างจากที่คาดการณ์ไว้
- ไล่ตามกำไรเล็กๆ น้อยๆ ตั้งเป้าไปที่การกระทำที่แพงที่สุดมากกว่าการปรับปรุง 1%
- ไม่สนใจต้นทุนแบตเตอรี่ของฟีเจอร์ AI รุ่น/กล้อง/เครือข่ายที่ทำงานอย่างต่อเนื่องกินแบตเตอรี่
- ทำให้เหนื่อยกับเรื่องหลัก การเริ่มและการเลื่อนที่หนักหน่วงไม่ควรอยู่บนเธรด UI
- ไม่วัดใหม่หลังจากการเพิ่มประสิทธิภาพ ตรวจสอบว่าการปรับปรุงเกิดขึ้นจริงและไม่ทำลายสิ่งใดๆ
- การวัดประสิทธิภาพในโปรแกรมจำลอง ความเร็วอุปกรณ์ อุณหภูมิ และแบตเตอรี่จริงแตกต่างกันโดยสิ้นเชิง
โดยสรุป
ประสิทธิภาพและแบตเตอรี่เป็นเรื่องของการอยู่รอดของแอพมือถือ กฎทอง: วัดผลก่อน ปรับให้เหมาะสมในภายหลัง การให้ข้อมูลโปรไฟล์แก่ AI จะช่วยเร่งการตีความ ความปรารถนาอันล้นเหลือที่จะ "เร่งความเร็ว" นำไปสู่การเดาแบบไม่รู้จบ ตั้งเป้าไปที่ธุรกรรมที่แพงที่สุด อย่าไล่ตามผลกำไรเล็กๆ น้อยๆ ความสามารถ AI ที่เพิ่มเข้ามาในโมดูลนี้มีประสิทธิภาพมาก แต่ต้องแบกรับต้นทุนแบตเตอรี่และโปรเซสเซอร์ จัดการต้นทุนนี้โดยการลดความถี่ในการสุ่มตัวอย่าง การแบ่งกลุ่ม และการทำงานเมื่อจำเป็นเท่านั้น วัดอีกครั้งบนอุปกรณ์จริงหลังจากการเพิ่มประสิทธิภาพแต่ละครั้ง
งานสมัคร
นำเข้าโปรไฟล์ในแอปพลิเคชัน (โครงการหรือตัวอย่างของคุณเอง) หรือสร้างเอาต์พุตโปรไฟล์ตัวอย่างและให้ AI ตีความด้วย "เทมเพลตการวิเคราะห์คอขวด" ใช้การเพิ่มประสิทธิภาพผลกระทบสูงสุดและวัดผลอีกครั้ง: ตัวเลขลดลงจริงหรือไม่ นอกจากนี้ ให้ประเมินคุณสมบัติ AI ที่คุณเพิ่มในโมดูลนี้ (รุ่นบนอุปกรณ์หรือการโทรบนคลาวด์) ในแง่ของแบตเตอรี่ด้วย "เทมเพลตต้นทุนคุณสมบัติ AI" และกำหนดการตั้งค่าที่เป็นมิตรต่อแบตเตอรี่อย่างน้อยหนึ่งรายการ
รายการตรวจสอบ
- [ ] ฉันได้รับโปรไฟล์ก่อนการปรับให้เหมาะสม ฉันไม่เดาเลย
- [ ] ฉันตั้งเป้าไปที่การซื้อขายที่แพงที่สุด ฉันไม่ได้กระจายผลกำไรเพียงเล็กน้อย
- [ ] ฉันให้ข้อมูลโปรไฟล์ AI เป็นตัวเลขที่เป็นรูปธรรม
- [ ] ฉันประเมินต้นทุนแบตเตอรี่/โปรเซสเซอร์ของฟีเจอร์ AI
- [ ] ฉันถอดการยกของหนักออกจากด้ายหลัก
- [ ] หลังจากการเพิ่มประสิทธิภาพ ฉันวัดอีกครั้งบนอุปกรณ์จริงและตรวจสอบการถดถอย