المقاييس هي النوع الرئيسي من المعلومات المستخرَجة من مقاييس الأداء. ويتم تمريرها إلى الدالة 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، داخل الدوال المركّبة للشاشة لإرسال إشارة تلقائيًا إلى Macrobenchmark عند انتهاء عرض بيانات الشبكة غير المتزامنة أو حالات واجهة المستخدم المعقّدة.
لمزيد من المعلومات حول تحليل أداء الإعداد وتحسينه، يُرجى الاطّلاع على وقت بدء تشغيل التطبيق.
FrameTimingMetric
تلتقط أداة FrameTimingMetric معلومات دقيقة عن التوقيت من الإطارات
التي تنتجها رحلة قياس الأداء، مثل الانتقال في قائمة أو تصميم واجهة مستخدم معقّد
للصور المتحركة، وتُخرج قيم التشخيص التالية:
-
frameOverrunMs: مقدار الوقت الذي تتجاوزه لقطة معيّنة عن الموعد النهائي المحدّد لها. تشير الأرقام الموجبة إلى إطار تم إسقاطه مصحوبًا بتأخُّر أو تقطُّع مرئي. تشير الأرقام السالبة إلى مدى سرعة اكتمال اللقطة مقارنةً بالموعد النهائي للأجهزة في النظام الفرعي. ملاحظة: لا يتوفّر هذا المقياس إلا على الإصدار 12 من نظام التشغيل Android (المستوى 31 من واجهة برمجة التطبيقات) والإصدارات الأحدث. -
frameDurationCpuMs: مقدار الوقت الذي استغرقه إنشاء اللقطة بشكل نشط على وحدة المعالجة المركزية (CPU) في كل من سلسلة واجهة المستخدم الرئيسية للتطبيق وRenderThread.
يتم جمع هذه القياسات في توزيع للشرائح المئوية الخمسين والتسعين والخامسة والتسعين والتاسعة والتسعين:
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 تلتقط التغيير في الطاقة أو الطاقة على مدار مدة
الاختبار لفئات الطاقة المقدَّمة. يتم تقسيم كل فئة تختارها إلى مكوّنات فرعية قابلة للقياس، وتتم إضافة الفئات غير المحدّدة إلى مقياس "غير محدّد".
يتم ربط مخرجات Terminal بالإعدادات التي تطلبها:
powerCategoryCpuUw: مقدار الطاقة التي تستهلكها وحدة المعالجة المركزية خلال مدة الاختبارpowerCategoryGpuUw: مقدار الطاقة التي تستهلكها وحدة معالجة الرسومات خلال مدة الاختبار.powerUnselectedUw: إجمالي الطاقة التي تستهلكها جميع فئات الأجهزة المتاحة التي لم يتم طلبها صراحةً في خريطة الإعداد.
لمنع الارتفاعات المفاجئة في البيانات على مسارات الأجهزة أثناء التشغيل، يمكنك قفل سطوع الشاشة على قيمة ثابتة، والحفاظ على درجة حرارة ثابتة للجهاز، وإغلاق العمليات المتنافسة في الخلفية قبل بدء حلقة Macrobenchmark.
مراجع إضافية
محتوى المشاهدات
التطبيقات المقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما يكون JavaScript غير مفعَّل
- إنشاء ملفات شخصية أساسية {:#creating-profile-rules}
- كتابة اختبار Macrobenchmark
- تحليل عملية بدء تشغيل التطبيق وتحسينها {:#app-startup-analysis-optimization}