الحصول على مقاييس مقاييس الأداء الكلية

المقاييس هي النوع الرئيسي من المعلومات المستخرَجة من مقاييس الأداء. ويتم تمريرها إلى الدالة measureRepeated على شكل List، ما يتيح لك تحديد مقاييس متعدّدة في الوقت نفسه. يجب تحديد نوع واحد على الأقل من المقاييس لتشغيل مقياس الأداء.

يلتقط مقتطف الرمز التالي مقاييس توقيت اللقطات وأقسام التتبُّع المخصّصة لواجهة تخطيط كسول في Jetpack Compose:

@OptIn(ExperimentalMetricApi::class)
    @Test
    fun scrollComposeList() {
        benchmarkRule.measureRepeated(
            // [START_EXCLUDE]
            packageName = TARGET_PACKAGE,
            metrics = listOf(
                FrameTimingMetric(),
                // Measure power usage. This is supported on Pixel 6 and later.
                PowerMetric(PowerMetric.Type.Power(
                    mapOf(
                        PowerCategory.CPU to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.DISPLAY to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.GPU to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.NETWORK to PowerCategoryDisplayLevel.TOTAL,
                    )
                )),
                // Measure custom trace sections by name EntryRow (which is added to the EntryRow composable).
                // Mode.Sum measures combined duration and also how many times it occurred in the trace.
                // This way, you can estimate whether a composable recomposes more than it should.
                TraceSectionMetric("EntryRowCustomTrace", TraceSectionMetric.Mode.Sum),
                // This trace section takes into account the SQL wildcard character %,
                // which can find trace sections without the full name.
                // This way, you can measure composables produced by the composition tracing
                // and measure how long they took and how many times they recomposed.
                // WARNING: This metric only shows results when running with composition tracing, otherwise it won't be visible in the outputs.
                TraceSectionMetric("%EntryRow%", TraceSectionMetric.Mode.Sum),
            ),
            // Try switching to different compilation modes to see the effect
            // it has on frame timing metrics.
            compilationMode = CompilationMode.None(),
            startupMode = StartupMode.WARM, // restarts activity each iteration
            iterations = DEFAULT_ITERATIONS,
            // [END_EXCLUDE]
            setupBlock = {
                uiAutomator {
                    // Before starting to measure, navigate to the UI to be measured.
                    startIntent(Intent("$packageName.COMPOSE_ACTIVITY"))
                }
            }
        ) {
            uiAutomator {
                onElement { isScrollable }.fling(Direction.DOWN)
            }
        }
    }

في المثال التالي، يمثّل EntryRowCustomTrace قسم تتبُّع مخصّصًا تم تحديده داخل طبقات العنصر القابل للإنشاء باستخدام أداة التغليف trace(sectionName) { ... } القياسية في Kotlin. لتوفير بيانات TraceSectionMetric، عليك تغليف مكوّنات واجهة المستخدم المستهدَفة داخل قاعدة رموز الإنتاج في تطبيقك باستخدام أداة التغليف trace القياسية في وقت تشغيل Jetpack:

@Composable
private fun EntryRow(entry: Entry, modifier: Modifier = Modifier) = trace("EntryRowCustomTrace") {
    Card(modifier = modifier) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Text(
                text = entry.contents,
                modifier = Modifier
                    .padding(16.dp)
                    .wrapContentSize()
            )

            Spacer(modifier = Modifier.weight(1f))

            Checkbox(
                checked = false,
                onCheckedChange = {},
                modifier = Modifier.padding(16.dp)
            )
        }
    }
}

يتم عرض نتائج مقياس الأداء مباشرةً في علامة التبويب مقياس الأداء في المحطة الطرفية داخل "استوديو Android"، كما هو موضّح في الشكل 1. إذا تم تحديد مقاييس متعدّدة، يتم دمج جميع نقاط البيانات المحسوبة في نافذة الملخّص.

نتائج TraceSectionMetric وFrameTimingMetric
الشكل 1 النتائج المجمّعة في وحدة التحكّم لكل من TraceSectionMetric وFrameTimingMetric لتخطيط Compose حديث

يتم تناول StartupTimingMetric وFrameTimingMetric وTraceSectionMetric وPowerMetric بالتفصيل أدناه. للاطّلاع على قائمة كاملة بمقاييس الأداء المتاحة ، يُرجى الاطّلاع على الفئات الفرعية من Metric في مرجع واجهة برمجة التطبيقات.

StartupTimingMetric

StartupTimingMetric يلتقط مقاييس توقيت بدء تشغيل التطبيق بالقيم التالية:

  • timeToInitialDisplayMs: مقدار الوقت الذي يستغرقه النظام من تلقّي هدف التشغيل إلى عرض اللقطة الأولى من الشاشة الوجهة.
  • timeToFullDisplayMs: مقدار الوقت الذي يستغرقه النظام من تلقّي هدف التشغيل إلى أن يُبلغ التطبيق عن اكتمال عملية الرسم باستخدام آليات الإبلاغ الداخلية للمنصة. يتوقف القياس عند اكتمال عرض اللقطة الأولى بعد الإشارة إلى اكتمال عملية الرسم أو التي تحتوي عليها.

يعرض StartupTimingMetric الحد الأدنى والمتوسط والحد الأقصى للقيم من عمليات بدء التشغيل. لتقييم تحسين بدء التشغيل، ركِّز دائمًا على القيم المتوسطة، لأنّها تقدّم أفضل تقدير لأوقات بدء التشغيل النموذجية للمستخدمين.

في بنية Compose-first، لا تحاول استدعاء activity.reportFullyDrawn يدويًا. بدلاً من ذلك، استخدِم الأدوات غير المتزامنة الآمنة في Compose، وهي ReportDrawn أو ReportDrawnWhen أو ReportDrawnAfter داخل الدوال البرمجية القابلة للإنشاء على شاشتك للإشارة تلقائيًا إلى Macrobenchmark عند اكتمال عرض بيانات الشبكة غير المتزامنة أو حالات واجهة المستخدم المعقّدة.

لمزيد من المعلومات عن تحليل أداء الإعداد وتحسينه، يُرجى الاطّلاع على مقالة وقت بدء تشغيل التطبيق.

FrameTimingMetric

FrameTimingMetric يلتقط معلومات دقيقة عن توقيت اللقطات التي تنتجها رحلة مقياس الأداء، مثل التمرير في قائمة أو تحريك تصميم واجهة المستخدم المعقّد، ويعرض القيم التشخيصية التالية:

  • frameOverrunMs: مقدار الوقت الذي تتأخر فيه لقطة معيّنة عن الموعد النهائي. تشير الأرقام الموجبة إلى لقطة تم إسقاطها مصحوبة بإيقاف مؤقت لعرض واجهة المستخدم أو تقطّع مرئي. تشير الأرقام السالبة إلى مدى سرعة اكتمال اللقطة مقارنةً بالموعد النهائي لأجهزة النظام الفرعي. ملاحظة: لا يتوفّر هذا المقياس إلا على Android 12 (مستوى واجهة برمجة التطبيقات 31) والإصدارات الأحدث.
  • frameDurationCpuMs: مقدار الوقت الذي استغرقه إنتاج اللقطة بنشاط على وحدة المعالجة المركزية (CPU) في كل من سلسلة واجهة المستخدم الرئيسية للتطبيق وRenderThread في Compose.

يتم جمع هذه القياسات في توزيع للنسب المئوية الخمسين والتسعين والخامسة والتسعين والتاسعة والتسعين:

frameDurationCpuMs P50 3.5, P90 6.0, P95 6.4, P99 11.0
frameOverrunMs P50 -11.6, P90 -7.2, P95 -7.1, P99 -1.2

عند تحسين تسلسلات تخطيط Jetpack Compose، اطّلِع على اللقطات الأسوأ أداءً (الحدود P95 وP99). إذا ارتفعت قيمة frameOverrunMs إلى أعداد صحيحة موجبة عند النسب المئوية المرتفعة، يشير ذلك إلى أنّ عمليات إعادة الإنشاء تؤدي إلى توقّف السلسلة الرئيسية مؤقتًا أثناء تحريك التمرير بشكل كبير.

للاطّلاع على إحصاءات أكثر تفصيلاً عن تحديد اللقطات البطيئة وحلّها، يُرجى الاطّلاع على مقالة أداء Jetpack Compose.

TraceSectionMetric

TraceSectionMetric يلتقط عدد مرات ظهور قسم تتبُّع معيّن ومقدار الوقت المطلق الذي يستغرقه تنفيذه. لتتبُّع الوقت، يعرض الحد الأدنى والمتوسط والحد الأقصى للأوقات بالملّي ثانية. يتم تحديد قسم التتبُّع المستهدَف إما من خلال استدعاء الدالة trace(sectionName) أو حدود المستوى الأدنى بين Trace.beginSection(sectionName) و Trace.endSection() أو المتغيّرات غير المتزامنة.

EntryRowCustomTraceCount min 20.0, median 28.0, max 50.0
EntryRowCustomTraceSumMs min 34.9, median 44.4, max 66.6

تلقائيًا، يعرض المقياس أقسام التتبُّع التي تم تجميعها مباشرةً من الثنائيات الخاصة بحزمة تطبيقك فقط. لتضمين العمليات التي تنشأ من خارج حدود حزمة تطبيقك، اضبط السمة targetPackageOnly = false.

عند العمل على تتبُّع وقت تشغيل Jetpack Compose، يمكنك عرض الدوال البرمجية القابلة للإنشاء الفردية في رسوم بيانية لتتبُّع النظام بدون كتابة أدوات تغليف التتبُّع يدويًا من خلال تفعيل تتبُّع الإنشاء.

في حين أنّ إضافة الاعتمادية androidx.compose.runtime:runtime-tracing إلى تطبيقك المستهدَف كافية لعمليات تتبُّع محلّل الأداء اليدوية، فإنّ التقاط عمليات التتبُّع هذه آليًا ضمن عملية تشغيل Macrobenchmark يتطلّب إعدادًا إضافيًا داخل وحدة مقياس الأداء.

للاطّلاع على تعليمات الإعداد الكاملة، يُرجى الرجوع إلى مقالة التقاط عملية تتبُّع باستخدام Jetpack Macrobenchmark.

PowerMetric

PowerMetric يلتقط التغيير في الطاقة أو القدرة خلال مدة تشغيل Macrobenchmark. يتم تقسيم كل فئة تم اختيارها إلى مكوّناتها المادية القابلة للقياس، بينما يتم تجميع الفئات غير المحدّدة في مجموعة "غير محدّدة".

المتطلبات المادية: تقيس هذه المقاييس الاستهلاك على مستوى النظام بدلاً من العمليات الحسابية على مستوى التطبيق. وبالتالي، يقتصر جمع البيانات على أجهزة Google Pixel 6 وPixel 6 Pro والأجهزة المادية الأحدث.

يعرض المقياس قياسَين لكل فئة:

  • power<category>Uw: مقدار الطاقة المستهلكة خلال مدة الاختبار في هذه الفئة (مقاسة بالميكروواط)
  • energy<category>Uws: إجمالي مقدار الطاقة المنقولة لكل وحدة زمنية خلال مدة الاختبار في هذه الفئة (مقاسة بالميكروواط في الثانية)

تشمل الفئات ما يلي:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

بالنسبة إلى بعض الفئات، مثل CPU، قد يكون من الصعب فصل العمل الذي تجريه العمليات الأخرى عن العمل الذي يجريه تطبيقك. لتقليل التداخل، عليك إزالة التطبيقات والحسابات غير الضرورية أو تقييدها.

powerCategoryCpuUw min 300.2, median 346.1, max 519.6
powerCategoryDisplayUw min 319.8, median 325.8, max 329.7
powerCategoryGpuUw min 18.8, median 23.3, max 36.9
powerCategoryNetworkUw min 97.3, median 123.3, max 681.3
powerTotalUw min 1234.8, median 1316.6, max 2112.4
powerUnselectedUw       min  483.3,  median  512.6,  max  561.7

تحليل الأنظمة الفرعية الأساسية

PowerMetric يلتقط التغيير في الطاقة أو القدرة خلال مدة الاختبار لفئات الطاقة المقدَّمة. يتم تقسيم كل فئة تختارها إلى مكوّناتها الفرعية القابلة للقياس، وتتم إضافة الفئات غير المحدّدة إلى المقياس "غير محدّد".

ترتبط النتائج في المحطة الطرفية بالإعدادات التي تطلبها:

  • powerCategoryCpuUw: مقدار الطاقة التي تستهلكها وحدة المعالجة المركزية (CPU) خلال مدة الاختبار
  • powerCategoryGpuUw: مقدار الطاقة التي تستهلكها وحدة معالجة الرسومات (GPU) خلال مدة الاختبار
  • powerUnselectedUw: إجمالي الطاقة التي تستهلكها جميع فئات الأجهزة المتاحة التي لم يتم طلبها بشكل صريح في خريطة الإعداد

لمنع حدوث ارتفاعات غير منتظمة في البيانات على مسارات الأجهزة أثناء عملية التشغيل، عليك ضبط سطوع الشاشة على قيمة ثابتة والحفاظ على درجة حرارة ثابتة للجهاز وإغلاق العمليات المتنافسة في الخلفية قبل بدء حلقة Macrobenchmark.

مراجع إضافية

محتوى "العروض"