תיעוד מדדי מאקרובנצ'מרק

מושגים ויישום ב-Jetpack Compose

מדדים הם סוג המידע העיקרי שמופק מהשוואות לשוק. הם מועברים לפונקציה measureRepeated כ-List, וכך אפשר לציין כמה מדדים נמדדים בבת אחת. כדי להריץ את ההשוואה לשוק, צריך לבחור לפחות סוג אחד של מדד.

קטע הקוד הבא מתעד את התזמון של הפריימים ואת המדדים של קטע המעקב המותאם אישית:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

בדוגמה הזו, RV CreateView ו-RV OnBindView הם המזהים של בלוקים שאפשר לעקוב אחריהם ומוגדרים ב-RecyclerView. קוד המקור של השיטה createViewHolder() הוא דוגמה לאופן שבו אפשר להגדיר בלוקים שאפשר לעקוב אחריהם בקוד שלכם.

StartupTimingMetric,‏ TraceSectionMetric וFrameTimingMetric מוסברים בפירוט בהמשך המסמך הזה. רשימה מלאה של מדדים זמינה במחלקות המשנה של Metric.

תוצאות הערכת הביצועים מוצגות ב-Android Studio, כמו באיור 1. אם מוגדרים כמה מדדים, כולם משולבים בפלט.

תוצאות של TraceSectionMetric ו-FrameTimingMetric.
איור 1. תוצאות של TraceSectionMetric ושל FrameTimingMetric.

StartupTimingMetric

StartupTimingMetric מתעד מדדים של תזמון הפעלת האפליקציה עם הערכים הבאים:

  • timeToInitialDisplayMs: משך הזמן מרגע שהמערכת מקבלת כוונת הפעלה ועד שהיא מעבדת את הפריימים הראשונים של היעד Activity.
  • timeToFullDisplayMs: משך הזמן שחל מהרגע שבו המערכת מקבלת כוונה להפעיל אפליקציה ועד שהאפליקציה מדווחת על ציור מלא באמצעות ה-method‏ reportFullyDrawn(). המדידה מסתיימת בסיום העיבוד של הפריים הראשון אחרי הקריאה לפונקציה reportFullyDrawn() או בתוכה. יכול להיות שהמדידה הזו לא תהיה זמינה ב-Android 10 (רמת API‏ 29) ובגרסאות קודמות.

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

תוצאות של StartupTimingMetric
איור 2. StartupTimingMetric תוצאות.

FrameTimingMetric

FrameTimingMetric מתעד מידע על תזמון מתוך פריימים שנוצרו על ידי מדד השוואה, כמו גלילה או אנימציה, ומפיק את הערכים הבאים:

  • frameOverrunMs: משך הזמן שבו פריים מסוים לא עמד בדדליין. מספרים חיוביים מציינים שהייתה נפילה של פריים, שגרמה לבעיות בממשק (jank) או לגמגום. מספרים שליליים מציינים כמה מהר יותר הושלם פריים ביחס למועד האחרון של חומרת מערכת המשנה. הערה: המדד הזה זמין רק ב-Android 12 (רמת API 31) ובגרסאות מתקדמות יותר.
  • frameDurationCpuMs: משך הזמן שנדרש ליצירת הפריים במעבד (CPU) בשרשור UI וב-RenderThread.

הנתונים האלה נאספים בהתפלגות של אחוזון 50, 90, 95 ו-99.

מידע נוסף על זיהוי מסגרות איטיות ושיפור שלהן זמין במאמר עיבוד איטי.

תוצאות של FrameTimingMetric
איור 3. FrameTimingMetric תוצאות.

TraceSectionMetric

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

הקטע של עקבות היעד מוגדר על ידי קריאה לפונקציה trace(sectionName) או על ידי גבולות של בלוק ברמה נמוכה יותר בין Trace.beginSection(sectionName) לבין Trace.endSection() או הגרסאות האסינכרוניות שלהם. הוא תמיד בוחר את המופע הראשון של קטע מעקב שנלכד במהלך מדידה. כברירת מחדל, הפלט כולל רק קטעי מעקב מהחבילה. כדי לכלול תהליכים מחוץ לחבילה, צריך להגדיר את targetPackageOnly = false.

מידע נוסף על מעקב זמין במאמרים סקירה כללית על מעקב אחר המערכת והגדרת אירועים מותאמים אישית.

TraceSectionMetric
איור 4. TraceSectionMetric תוצאות.