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

מושגים והטמעה של 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: משך הזמן שבו פריים מסוים חורג מהמועד האחרון שלו. מספרים חיוביים מציינים פריים שהושמט, וגם קפיצות או קטיעות שאפשר לראות. מספרים שליליים מציינים כמה מהר יותר הושלם פריים ביחס למועד האחרון של חומרת תת-המערכת. הערה: המדד הזה זמין רק ב-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 תוצאות.