השוואה בין מדדי 'כתיבה' ו'צפייה'

Jetpack Compose מזרז את פיתוח ממשק המשתמש ומשפר את הפיתוח של Android. עם זאת, חשוב לזכור שהוספת Compose לאפליקציה קיימת עשויה להשפיע על מדדים כמו גודל ה-APK, ה-build והביצועים בסביבת זמן הריצה של האפליקציה.

גודל ה-APK וזמני ה-build

בקטע הזה נסביר על ההשפעה על גודל ה-APK ועל זמן ה-build באמצעות האפליקציה לדוגמה Sunflower – אפליקציה שממחישה שיטות מומלצות להעברת אפליקציה שמבוססת על View ל-Compose.

גודל ה-APK

הוספת ספריות לפרויקט מגדילה את גודל קובץ ה-APK. התוצאות הבאות הן של חבילות ה-APK המינימליות של כל פרויקט עם התכונה 'צמצום משאבים וקידוד' מופעלת, באמצעות מצב מלא של R8, ונמדדו באמצעות APK Analyzer.

צפיות בלבד תצוגות מעורבות וכתיבה כתיבה בלבד
גודל הורדה 2,252 KB 3,034 KB 2,966 KB

כשהוסיפה Compose ל-Sunflower בפעם הראשונה, גודל ה-APK גדל מ-2,252KB ל-3,034KB – עלייה של 782KB. קובץ ה-APK שנוצר כלל את ה-build של ממשק המשתמש עם שילוב של תצוגות ו-Compose. העלייה הזו צפויה כי נוספו יחסי תלות נוספים ל-Sunflower.

לעומת זאת, כשהאפליקציה Sunflower הועברה לאפליקציה של Compose בלבד, גודל ה-APK ירד מ-3,034KB ל-2,966KB – ירידה של 68KB. הירידה הזו נובעת מהסרה של יחסי תלות של תצוגות שלא בשימוש, כמו AppCompat ו-ConstraintLayout.

משך הזמן של תהליך ה-build

הוספת Compose מאריכה את זמן ה-build של האפליקציה, כי המהדר של Compose מעבד את הרכיבים הניתנים ליצירה באפליקציה. התוצאות הבאות התקבלו באמצעות הכלי העצמאי gradle-profiler, שמריץ build כמה פעמים כדי לקבל זמן build ממוצע למשך ה-build לניפוי באגים של Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
צפיות בלבד תצוגות מעורבות וכתיבה כתיבה בלבד
משך הזמן הממוצע של תהליך build 299.47 אלפיות השנייה 399.09 אלפיות השנייה 342.16 אלפיות השנייה

כשהוסיפה את Compose ל-Sunflower בפעם הראשונה, זמן ה-build הממוצע עלה מ-299 אלפיות שנייה ל-399 אלפיות שנייה – עלייה של 100 אלפיות שנייה. משך הזמן הזה נובע מכך שמהדר Compose מבצע משימות נוספות כדי לשנות את קוד Compose שמוגדר בפרויקט.

לעומת זאת, זמן ה-build הממוצע ירד ל-342 אלפיות השנייה, ירידה של 57 אלפיות השנייה, אחרי שהשלימו את ההעברה של Sunflower ל-Compose. הפחתה זו נובעת מכמה גורמים שמצטברים יחד ומקצרים את זמן ה-build, כמו הסרת קישור נתונים, העברת יחסי תלות שמשתמשים ב-kapt ל-KSP ועדכון של כמה יחסי תלות לגרסאות העדכניות ביותר שלהם.

סיכום

השימוש ב-Compose יגביר את גודל ה-APK של האפליקציה, וגם את הביצועים שלה בזמן ה-build, בגלל תהליך הידור הקוד של Compose. עם זאת, צריך לשקול את הפשרות האלה מול היתרונות של Compose, במיוחד מבחינת העלייה בפרודוקטיביות של המפתחים כשהם משתמשים ב-Compose. לדוגמה, צוות Play Store גילה שכתיבת ממשק משתמש דורשת הרבה פחות קוד, לפעמים עד 50%, וכך הגדיל את הפרודוקטיביות ואת יכולת התחזוקה של הקוד.

מידע נוסף על מקרים לדוגמה זמין במאמר הטמעת Compose ל-Teams.

ביצועים בזמן ריצה

בקטע הזה נסקור נושאים שקשורים לביצועים בסביבת זמן הריצה ב-Jetpack Compose, כדי לעזור לכם להבין איך Jetpack Compose משתווה לביצועים של מערכת התצוגה, ואיך אפשר למדוד אותם.

קומפוזיציות מחדש חכמות

כשחלקים מממשק המשתמש לא תקינים, Compose מנסה ליצור מחדש רק את החלקים שצריך לעדכן. מידע נוסף זמין במאמרים מחזור החיים של רכיבים ליצירת קומפוזיציות ושלבי Jetpack Compose.

פרופילים Baseline

פרופילים בסיסיים הם דרך מצוינת לזרז תהליכים נפוצים שעוברים משתמשים. הכללת פרופיל בסיס באפליקציה יכולה לשפר את מהירות ביצוע הקוד בכ-30% מההפעלה הראשונה, על ידי הימנעות משלב הפרשנות ומשלבי הידור בזמן אמת (JIT) בנתיבים של הקוד שכלולים.

ספריית Jetpack Compose כוללת פרופיל Baseline משלה, והאופטימיזציות האלה מתבצעות באופן אוטומטי כשמשתמשים ב-Compose באפליקציה. עם זאת, האופטימיזציות האלה משפיעות רק על נתיבי הקוד בספריית Compose, לכן מומלץ להוסיף פרופיל Baseline לאפליקציה כדי לכסות נתיבי קוד מחוץ ל-Compose.

השוואה למערכת View

ב-Jetpack Compose יש שיפורים רבים ביחס למערכת View. השיפורים האלה מתוארים בקטעים הבאים.

כל הרכיבים מורחבים באמצעות View

כל View שמצויר במסך, כמו TextView,‏ Button או ImageView, דורש הקצאות זיכרון, מעקב מפורש אחרי המצב וקריאות חזרה שונות כדי לתמוך בכל התרחישים לדוגמה. בנוסף, הבעלים של View בהתאמה אישית צריך להטמיע לוגיקה מפורשת כדי למנוע ציור מחדש כשאין צורך בכך – לדוגמה, לעיבוד נתונים חוזר.

ב-Jetpack פיתוח נייטיב יש כמה דרכים לטפל בבעיה הזו. ב-Compose אין אובייקטים מפורשים שניתן לעדכן עבור תצוגות ציור. רכיבי ממשק המשתמש הם פונקציות פשוטות שניתן לשלב, והמידע שלהן נכתב בהרכבה באופן שניתן להפעיל מחדש. כך אפשר לצמצם את המעקב אחר המצב, הקצאת הזיכרון והקריאות החוזרות (callbacks) רק לרכיבי ה-Composables שדורשים את התכונות האלה, במקום לדרוש אותן מכל התוספים מסוג View נתון.

בנוסף, Compose מספק הרכבות מחדש חכמות, שמאפשרות להפעיל מחדש את התוצאה שצוירה בעבר אם אין צורך לבצע שינויים.

מספר סבבים של פריסה

ל-ViewGroups מסורתיים יש יכולת הבעה רבה בממשקי ה-API למדידות ולפריסה, ולכן הם נוטים לעבור כמה שלבים של פריסה. אם תבצעו כמה סבבים של פריסה בנקודות מסוימות בתוך היררכיית התצוגה, יכול להיות שתצטרכו לבצע עבודה רבה יותר.

Jetpack Compose אוכף מחזור פריסה יחיד לכל הרכיבים הניתנים ליצירה באמצעות פריסה באמצעות חוזה ה-API שלו. כך אפשר לטפל ביעילות בעצים עמוקים של ממשק משתמש ב-Compose. אם צריך לבצע כמה מדידות, ב-Compose יש מדידות מובנות.

הצגת ביצועי האפליקציה בזמן ההפעלה

מערכת התצוגה צריכה לנפח פריסות XML כשהיא מציגה פריסה מסוימת בפעם הראשונה. העלויות האלה נחסכות ב-Jetpack Compose כי הפריסות נכתבות ב-Kotlin ומתורגמות כמו שאר האפליקציה.

Benchmark Compose

ב-Jetpack Compose 1.0 יש הבדלים משמעותיים בין הביצועים של אפליקציה במצבים debug ו-release. כדי לקבל נתוני זמן מייצגים, תמיד צריך להשתמש ב-build של release במקום ב-debug כשמבצעים ניתוח פרופיל של האפליקציה.

כדי לבדוק את הביצועים של קוד Jetpack Compose, אפשר להשתמש בספרייה Jetpack Macrobenchmark. במאמר הפרויקט MacrobenchmarkSample מוסבר איך משתמשים ב-Microbenchmark עם Jetpack Compose.

צוות Jetpack Compose משתמש גם ב-Macrobenchmark כדי לזהות נסיגות (regressions) שעשויות לקרות. לדוגמה, אפשר לעיין במדד השוואה לעמודה עצלה ובמרכז הבקרה שלה כדי לעקוב אחרי רגרסיות.

כתיבת התקנת פרופיל

מכיוון ש-Jetpack Compose היא ספרייה לא מקובצת, היא לא נהנית מ-Zygote, שמטען מראש את הכיתות והרכיבים הניתנים לציור של ערכת הכלים של ממשק המשתמש של מערכת התצוגה. ב-Jetpack Compose 1.0 נעשה שימוש בהתקנת פרופיל לגרסאות build של גרסאות ייצור. כלי התקנה של פרופילים מאפשרים לאפליקציות לציין קוד קריטי שצריך לעבור הידור מראש (AOT) בזמן ההתקנה. Compose כולל כללי התקנה של פרופילים שמקצרים את זמן ההפעלה ומפחיתים את התנודות באפליקציות Compose.