المقاييس هي النوع الرئيسي من المعلومات المستخرَجة من مقاييس الأداء. يتم تمريرها إلى الدالة 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 لتنسيق Compose عصريسيتم تناول StartupTimingMetric وFrameTimingMetric وTraceSectionMetric وPowerMetric بالتفصيل أدناه. للحصول على قائمة كاملة بمقاييس الأداء المتاحة، اطّلِع على الفئات الفرعية من Metric في مرجع واجهة برمجة التطبيقات.
StartupTimingMetric
تسجّل StartupTimingMetric مقاييس توقيت بدء تشغيل التطبيق بالقيم التالية:
timeToInitialDisplayMs: مقدار الوقت المستغرَق منذ أن يتلقّى النظام نية التشغيل إلى أن يعرض اللقطة الأولى لشاشة الوجهة.timeToFullDisplayMs: مقدار الوقت المستغرَق منذ أن يتلقّى النظام نية التشغيل إلى أن يُبلغ التطبيق عن اكتمال عملية الرسم باستخدام آليات إعداد التقارير الداخلية للمنصة. يتوقف القياس عند اكتمال عرض الإطار الأول بعد الإشارة التي تم رسمها بالكامل أو التي تتضمّنها.
تعرض StartupTimingMetric الحد الأدنى والمتوسط والحد الأقصى للقيم من عمليات التكرار عند بدء التشغيل. لتقييم تحسُّن وقت بدء التشغيل، ركِّز دائمًا على قيم الوسيط، لأنّها تقدّم أفضل تقدير لأوقات بدء التشغيل النموذجية للمستخدمين.
في بنية Compose-first، لا تحاول استدعاء
activity.reportFullyDrawn يدويًا. بدلاً من ذلك، استخدِم أدوات المساعدة غير المتزامنة المتوافقة مع Compose، مثل ReportDrawn أو ReportDrawnWhen أو ReportDrawnAfter، داخل عناصر Compose الخاصة بالشاشة لإرسال إشارة تلقائية إلى Macrobenchmark عند انتهاء عرض بيانات الشبكة غير المتزامنة أو حالات واجهة المستخدم المعقّدة.
لمزيد من المعلومات حول تحليل أداء عملية التهيئة وتحسينه، اطّلِع على مقالة وقت بدء تشغيل التطبيق.
FrameTimingMetric
تتضمّن FrameTimingMetric معلومات دقيقة عن التوقيت من اللقطات التي تم إنشاؤها خلال رحلة قياس الأداء، مثل التمرير في قائمة أو تحريك تصميم واجهة المستخدم المعقّد، وتعرض قيم التشخيص التالية:
frameOverrunMs: مقدار الوقت الذي يتأخر فيه عرض لقطة معيّنة عن الموعد النهائي. تشير الأرقام الموجبة إلى إطار تم إسقاطه مصحوبًا بإيقاف مؤقت لعرض واجهة المستخدم أو تقطُّع مرئي. تشير الأرقام السالبة إلى مدى سرعة اكتمال اللقطة مقارنةً بالموعد النهائي المحدد لأجهزة النظام الفرعي. ملاحظة: لا يتوفّر هذا المقياس إلا على الإصدار 12 من نظام التشغيل Android (المستوى 31 من واجهة برمجة التطبيقات) والإصدارات الأحدث.-
frameDurationCpuMs: مقدار الوقت الذي استغرقه إنتاج اللقطة بنشاط على وحدة المعالجة المركزية في كلّ من سلسلة واجهة المستخدم الرئيسية للتطبيق وRenderThread.
يتم جمع هذه القياسات في توزيع الشرائح المئوية 50 و90 و95 و99 على النحو التالي:
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: إجمالي كمية الطاقة المنقولة لكل وحدة زمنية خلال مدة الاختبار في هذه الفئة (يتم قياسها بوحدة ميكروواط ثانية).
تشمل الفئات ما يلي:
CPUDISPLAYGPUGPSMEMORYMACHINE_LEARNINGNETWORKUNCATEGORIZED
في بعض الفئات، مثل 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: مقدار الطاقة التي استهلكتها وحدة معالجة الرسومات خلال مدة الاختبارpowerUnselectedUw: إجمالي الطاقة التي تستهلكها جميع فئات الأجهزة المتاحة التي لم يتم طلبها بشكل صريح في خريطة التهيئة.
لمنع حدوث ارتفاعات مفاجئة في البيانات على مسارات الأجهزة أثناء التشغيل، اضبط سطوع الشاشة على قيمة ثابتة، وحافظ على درجة حرارة الجهاز ثابتة، وأغلِق العمليات المتنافسة في الخلفية قبل بدء حلقة Macrobenchmark.
مراجع إضافية
عرض المحتوى
مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون JavaScript غير مفعّلة
- إنشاء ملفات تعريف أساسية {:#creating-profile-rules}
- كتابة Macrobenchmark
- تحليل عملية بدء تشغيل التطبيق وتحسينها {:#app-startup-analysis-optimization}