רווחים:
- על ידי נטילת פרופיל ומדידת צוואר הבקבוק האמיתי, ביצוע אופטימיזציה על סמך נתונים ולא ניחושים ופרשנות פלט הפרופיל על ידי בינה מלאכותית
- יכולת לכוון את הפעולה היקרה ביותר מבחינת זמן הפעלה, שטף, זיכרון וסוללה ולהסיר את העבודה הכבדה מהשרשור הראשי
- יכולת לנהל את עלות הסוללה והמעבד של יכולות בינה מלאכותית כגון מודל במכשיר ושיחות ענן באמצעות דגימה ועיבוד אצווה
משתמשי סלולר חסרי סבלנות. אם האפליקציה נפתחת לאט, נתקעת תוך כדי גלילה או רוקנת את הסוללה במהירות, המשתמש מוחק אותה ומעניק לה דירוג כוכבים בחנות. ביצועים ויעילות הסוללה הם עניין של הישרדות של אפליקציה לנייד; זה משפיע ישירות הן על שביעות רצון המשתמש והן על דירוג החנות. AI הוא כלי עזר רב עוצמה בזיהוי צווארי בקבוק בביצועים (צווארי בקבוק), בפירוש תוצאות מדידה והמלצה על אופטימיזציות. אבל כלל הזהב נשאר: למדוד קודם, לייעל אחר כך. ביחידה זו נלמד לפתור בעיות ביצועים וסוללה בצורה מבוססת נתונים עם AI. נושא חשוב במיוחד הוא ניהול ההשפעה על הסוללה והביצועים של יכולות הבינה המלאכותית שהוספנו ביחידות קודמות (דגם במכשיר, קריאת ענן).
אופטימיזציה ללא מדידה
הטעות הגדולה ביותר של מפתח חסר ניסיון היא אופטימיזציה חזויה: בזבוז זמן באמירה "זה חייב להיות איטי". צוואר הבקבוק האמיתי נמצא כמעט תמיד במקום לא צפוי. אז קודם כל לוקחים את הפרופיל (פרופילינג - מדידה איזה חלק באפליקציה גוזל כמה זמן/זיכרון/סוללה). Android Studio Profiler ו-Xcode Instruments מיועדים לעבודה זו. מתן נתוני מדידה ל-AI מאיץ את הפרשנות; אבל בלי מדידה, להגיד לבינה מלאכותית "האפליקציה שלי איטית, להאיץ אותה" פירושה חיזויים בצורה עיוורת.
ארבעת צירי הביצוע העיקריים הם:
ציר
סימפטום
סיבה טיפוסית
שעת התחלה
הבקשה נפתחת מאוחר
עבודה כבדה על חוט ראשי
שטף (ג'אנק)
גלילה נתקעת
עיבוד ארוך, שרטוט מיותר בשרשור ממשק המשתמש
זיכרון
נפיחות, קריסה
דליפה, תמונה גדולה, מטמון לא מבוקר
סוללה/חום
שפיכה מהירה
מיקום רציף, רשת, חיישן, עבודת רקע
טיפ: כששואלים את ה-AI על בעיית ביצועים, תן את פלט הפרופיל (איזו פונקציה לוקחת כמה זמן, גרף זיכרון). נתונים קשיחים כמו "הפונקציה הזו לוקחת 30ms לכל מסגרת" מאפשרת ל-AI להתמקד בצוואר הבקבוק האמיתי; ביטוי סובייקטיבי כמו "איטי" מייצר תשובה גנרית וחסרת תועלת.
עלות סוללה של יכולות AI
תכונות הבינה המלאכותית שהוספנו במודול זה הן חזקות, אך אינן חינמיות. חילוץ דגם במכשיר מאמץ את המעבד והסוללה; זיהוי תמונה הפועל ללא הרף (למשל מצלמה מעבדת כל פריים) יחמם את הטלפון וירוקן את הסוללה תוך דקות. שיחות בינה מלאכותית בענן, לעומת זאת, גוזלות את הסוללה על ידי שמירה על רדיו הרשת (האנטנה ששולחת ומקבלת נתונים) כל הזמן. פתרונות: הפעל את הדגם במכשיר רק בעת הצורך, דגום את המצלמה כמה פעמים בשנייה במקום כל פריים, שלח בקשות ענן באצווה, עשה את המטלות הכבדות בזמן שהמכשיר בטעינה או במצב סרק.
זהירות: תכונת AI הפועלת כל הזמן (תרגום חי, זיהוי אובייקטים מתמשך) יכולה לרוקן את הסוללה במהירות רבה, לחמם את המכשיר, ועלולה להיות מצערת על ידי המערכת. תכונה שגורמת למשתמש להרגיש שהעלות הזו נמחקת. אני תמיד שואל AI "איך אני הופך את התכונה הזו לידידתית בסוללה?" שאל גם את השאלה.
שלבי אופטימיזציה
- למדוד. מצא את צוואר הבקבוק האמיתי עם Profiler; אל תנחש.
- בחר את הבעיה הגדולה ביותר. אל תרדוף אחרי שיפור של 1%; כוונו לעסקה היקרה ביותר.
- שאל AI עם נתונים. בקש הצעת אופטימיזציה עם פלט פרופיל + קוד רלוונטי.
- למרוח ולמדוד שוב. האם השיפור אמיתי? האם המספר ירד?
- בקרת רגרסיה. האם האופטימיזציה שברה משהו? חזור על בדיקות חזותיות ותפקודיות.
שלושה מיני תיקים
מקרה 1 - חיפוש במקום הלא נכון. צוות אחד חשב שהרשימות נתקעו ועיבד מחדש את קוד הגלילה במשך שבועות ללא הועיל. כשהם לקחו את הפרופיל והזינו את הנתונים ל-AI, התברר שצוואר הבקבוק האמיתי היה התמונות שנטענות מחדש ברשת עם כל שורה. כשהמטמון הוויזואלי נוסף, השטף גדל מ-42 FPS ל-60 FPS. לקח: מדידה מונעת שבועות של מאמץ עקר.
מקרה 2 - תכונת מפלצת סוללה. אפליקציית תרגום הוסיפה תרגום טקסט חי עם מצלמה; משתמשים התלוננו כי "הטלפון התחמם תוך 15 דקות ו-30% מהסוללה נעלמה". כאשר התייעצו עם הבינה המלאכותית, נמצא שהמצלמה מעבדת 30 פריימים בשנייה; כאשר זה צומצם ל-5 פריימים והתוצאה עודכנה בהפרש של כמה פריימים, צריכת הסוללה ירדה לשליש, והאיכות לא הייתה מורגשת. שיעור: הגדר תמיד את AI עם עין הסוללה.
מקרה 3 - התחלה איטית. אפליקציה נפתחה תוך 4.5 שניות; 20% מהמשתמשים עזבו בעת ההפעלה. הפרופיל הראה שכל העבודה הראשונית (ניתוח, טעינת נתונים, הכנת מודל) נעשתה ברצף על השרשור הראשי. עם הצעת הבינה המלאכותית, אלה נדחו והועלו על השריפה האחורית; זמן הפתיחה צומצם ל-1.3 שניות, ושיעור הנטישה ירד בחצי. שיעור: בצע רק עבודה חיונית בהתחלה.
הנחיה חלשה / הנחיה חזקה
הנחיה חלשה: "האפליקציה שלי איטית, האיץ אותה."
הנחיה עוצמתית: "גלילת רשימה נתקעת (ג'אנק) באפליקציית האנדרואיד שלי. נתוני פרופיל: bindImageView לוקח 28ms על כל פריים, תמונות נטענות מהרשת בכל פעם, אין מטמון. קוד קשור: [קוד מתאם RecyclerView]. המלץ על 3 האופטימיזציות היעילות ביותר לפי סדר הפתרון וההשפעה האפשרית. ציין את הרווח הצפוי לכל תמונה. איכות."
תבניות הניתנות להעתקה
תבנית ניתוח צוואר בקבוק: "פרש את נתוני הפרופיל הבאים ומצא את 3 הפעולות היקרות ביותר: [פלט פרופיל]. הצע סיבה אפשרית ואופטימיזציה קונקרטית לכל אחת מהן. תן תחילה את ההשפעה הגבוהה ביותר."
תבנית אופטימיזציה של סוללה: "תכונה זו מרוקנת את הסוללה במהירות: [תכונה, למשל מיקום קבוע]. הפוך אותה ידידותית לסוללה:- הפחת את תדירות הדגימה- הגבלה ברקע- עיבוד אצווה- הפעל רק כשצריך מיין פתרונות מבלי לשבש את חוויית המשתמש. [קוד]"
תבנית האתחול האתחול: "האיץ את הפעלת האפליקציה. דברים שנעשו כעת בעת האתחול: [רשימה]. מה ניתן לדחות, רקע או לטעון בעצלתיים? הפרד את החיוניים. [קוד]"
תבנית עלות תכונת AI: "העריך את הביצועים ועלות הסוללה של התכונה [מודל במכשיר / שיחה בענן] שהוספתי. רשום את המדדים שעלי למדוד ואסטרטגיות להפחתת העלות. [קוד]"
טעויות נפוצות
- אופטימיזציה ללא מדידה. צוואר הבקבוק האמיתי נמצא לעתים קרובות במיקום שונה מהצפוי.
- רודף אחרי רווחים קטנים. כוון לפעולה היקרה ביותר ולא לשיפור של 1%.
- התעלמות מעלות הסוללה של תכונות AI. דגם/מצלמה/רשת פועל ללא הרף אוכל את הסוללה.
- מעייף את השרשור הראשי. ההרמה הכבדה של התנעה וגלילה אינה אמורה להיות בשרשור ממשק המשתמש.
- לא מודדים מחדש לאחר אופטימיזציה. ודא שהשיפור אמיתי ואינו שובר דבר.
- מדידת ביצועים באמולטור. מהירות המכשיר, הטמפרטורה והסוללה בפועל שונים לחלוטין.
לסיכום
ביצועים וסוללה הם עניין של הישרדות של אפליקציה לנייד. כלל הזהב: למדוד קודם, לייעל אחר כך. מתן נתוני פרופיל ל-AI מזרז את הפרשנות; הרצון הבלתי ניתן לשיעור "לזרז" מוביל לניחושים עיוורים. כוונו לעסקה היקרה ביותר, אל תרדוף אחרי רווחים קטנים. יכולות ה-AI שנוספו במודול זה הן חזקות אך נושאות עלויות סוללה ומעבד; נהל עלות זו על ידי הפחתת תדירות הדגימה, אצווה והרצה רק בעת הצורך. מדדו שוב במכשיר האמיתי לאחר כל אופטימיזציה.
משימת יישום
ייבא פרופיל באפליקציה (פרויקט או דוגמה משלך) או צור פלט פרופיל לדוגמה ופרש אותו על ידי ה-AI עם "תבנית ניתוח צוואר הבקבוק". החל את אופטימיזציית ההשפעה הגבוהה ביותר ומדוד שוב: האם המספר אכן ירד? כמו כן, הערך תכונת AI שהוספת במודול זה (דגם במכשיר או שיחת ענן) במונחים של סוללה עם "תבנית עלות תכונת AI" וקבע לפחות הגדרה אחת ידידותית לסוללה.
רשימת בדיקה
- [ ] קיבלתי פרופיל לפני אופטימיזציה, לא ניחשתי
- [ ] כיוונתי למסחר הכי יקר, לא פיזרתי על רווחים קטנים
- [ ] נתתי את נתוני פרופיל הבינה המלאכותית במספרים קונקרטיים
- [ ] הערכתי את עלות הסוללה/מעבד של תכונות בינה מלאכותית
- [ ] הסרתי את ההרמה הכבדה מהשרשור הראשי
- [ ] לאחר אופטימיזציה, מדדתי שוב במכשיר האמיתי ובדקתי את הרגרסיה