للتعرّف على كيفية استخدام مكتبة Microbenchmark من خلال إضافة تغييرات إلى رمز تطبيقك، راجِع قسم البدء السريع. للتعرّف على كيفية إكمال عملية إعداد كاملة مع إجراء تغييرات أكثر تعقيدًا على قاعدة الرموز البرمجية، يُرجى الاطّلاع على قسم إعداد المشروع الكامل.
Quickstart
يوضّح هذا القسم كيفية تجربة قياس الأداء وتنفيذ عمليات قياس لمرة واحدة بدون الحاجة إلى نقل الرمز إلى وحدات. للحصول على نتائج أداء دقيقة، تتضمّن هذه الخطوات إيقاف تصحيح الأخطاء في تطبيقك، لذا احتفِظ بنسخة عمل محلية بدون إرسال التغييرات إلى نظام التحكّم في المصدر.
لإجراء قياس أداء لمرة واحدة، اتّبِع الخطوات التالية:
أضِف المكتبة إلى ملف
build.gradle
أوbuild.gradle.kts
الخاص بالوحدة:Kotlin
dependencies { implementation("androidx.benchmark:benchmark-junit4:1.2.4") }
Groovy
dependencies { implementation 'androidx.benchmark:benchmark-junit4:1.2.4' }
استخدِم تبعية
implementation
بدلاً من تبعيةandroidTestImplementation
. إذا كنت تستخدمandroidTestImplementation
، لن يتم تشغيل مقاييس الأداء لأنّه لم يتم دمج ملف البيان الخاص بالمكتبة في ملف بيان التطبيق.عدِّل نوع الإصدار
debug
لكي لا يكون قابلاً لتصحيح الأخطاء:Kotlin
android { ... buildTypes { debug { isDebuggable = false } } }
Groovy
android { ... buildTypes { debug { debuggable false } } }
غيِّر
testInstrumentationRunner
إلىAndroidBenchmarkRunner
:Kotlin
android { ... defaultConfig { testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Groovy
android { ... defaultConfig { testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
أضِف مثيلاً من
BenchmarkRule
في ملف اختبار في الدليلandroidTest
لإضافة مقياس الأداء. لمزيد من المعلومات حول كتابة مقاييس الأداء، يُرجى الاطّلاع على إنشاء فئة Microbenchmark.يوضِّح مقتطف الرمز التالي كيفية إضافة مقياس أداء إلى اختبار Instrumented:
Kotlin
@RunWith(AndroidJUnit4::class) class SampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() { benchmarkRule.measureRepeated { doSomeWork() } } }
Java
@RunWith(AndroidJUnit4.class) class SampleBenchmark { @Rule public BenchmarkRule benchmarkRule = new BenchmarkRule(); @Test public void benchmarkSomeWork() { BenchmarkRuleKt.measureRepeated( (Function1<BenchmarkRule.Scope, Unit>) scope -> doSomeWork() ); } } }
للتعرّف على كيفية كتابة مقياس أداء، انتقِل إلى إنشاء فئة Microbenchmark.
إعداد المشروع بالكامل
لإعداد مقاييس أداء منتظمة بدلاً من مقاييس أداء لمرة واحدة، قسِّم مقاييس الأداء إلى وحدة خاصة بها. يساعد ذلك في ضمان أنّ عملية الإعداد، مثل ضبط debuggable
على false
، منفصلة عن الاختبارات العادية.
بما أنّ مكتبة Microbenchmark تشغّل الرمز البرمجي مباشرةً، ضَع الرمز البرمجي الذي تريد قياس أدائه في وحدة Gradle منفصلة واضبط التبعية على هذه الوحدة كما هو موضّح في الشكل 1.

:app
و:microbenchmark
و:benchmarkable
Gradle، ما يتيح لأداة Microbenchmarks قياس أداء الرمز البرمجي في الوحدة :benchmarkable
.لإضافة وحدة Gradle جديدة، يمكنك استخدام معالج الوحدات في "استوديو Android". ينشئ المعالج وحدة تم ضبطها مسبقًا لإجراء قياس الأداء، مع إضافة دليل قياس الأداء وضبط debuggable
على false
.
انقر بزر الماوس الأيمن على مشروعك أو الوحدة في لوحة المشروع في "استوديو Android"، ثم انقر على جديد > وحدة.
انقر على مقياس الأداء في لوحة النماذج.
اختَر اختبار الأداء المصغّر كنوع وحدة اختبار الأداء.
اكتب "microbenchmark" لاسم الوحدة.
انقر على إنهاء.

بعد إنشاء الوحدة، غيِّر ملف build.gradle
أو build.gradle.kts
وأضِف androidTestImplementation
إلى الوحدة التي تحتوي على الرمز البرمجي
الذي سيتم قياس أدائه:
Kotlin
dependencies { // The module name might be different. androidTestImplementation(project(":benchmarkable")) }
Groovy
dependencies { // The module name might be different. androidTestImplementation project(':benchmarkable') }
إنشاء فئة Microbenchmark
المقاييس هي اختبارات قياس حالة التطبيق العادية. لإنشاء مقياس أداء، استخدِم الفئة
BenchmarkRule
التي توفّرها المكتبة. لمقارنة الأنشطة، استخدِم ActivityScenario
أو ActivityScenarioRule
. لمقارنة أداء رمز واجهة المستخدم، استخدِم @UiThreadTest
.
يعرض الرمز التالي نموذجًا لمقياس أداء:
Kotlin
@RunWith(AndroidJUnit4::class) class SampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() { benchmarkRule.measureRepeated { doSomeWork() } } }
Java
@RunWith(AndroidJUnit4.class) class SampleBenchmark { @Rule public BenchmarkRule benchmarkRule = new BenchmarkRule(); @Test public void benchmarkSomeWork() { final BenchmarkState state = benchmarkRule.getState(); while (state.keepRunning()) { doSomeWork(); } } }
إيقاف التوقيت أثناء عملية الإعداد
يمكنك إيقاف التوقيت لأقسام الرمز التي لا تريد قياسها باستخدام الحظر runWithTimingDisabled{}
. تمثّل هذه الأقسام عادةً بعض الرموز التي عليك تنفيذها في كل تكرار من مقياس الأداء.
Kotlin
// using random with the same seed, so that it generates the same data every run private val random = Random(0) // create the array once and just copy it in benchmarks private val unsorted = IntArray(10_000) { random.nextInt() } @Test fun benchmark_quickSort() { // ... benchmarkRule.measureRepeated { // copy the array with timing disabled to measure only the algorithm itself listToSort = runWithTimingDisabled { unsorted.copyOf() } // sort the array in place and measure how long it takes SortingAlgorithms.quickSort(listToSort) } // assert only once not to add overhead to the benchmarks assertTrue(listToSort.isSorted) }
Java
private final int[] unsorted = new int[10000]; public SampleBenchmark() { // Use random with the same seed, so that it generates the same data every // run. Random random = new Random(0); // Create the array once and copy it in benchmarks. Arrays.setAll(unsorted, (index) -> random.nextInt()); } @Test public void benchmark_quickSort() { final BenchmarkState state = benchmarkRule.getState(); int[] listToSort = new int[0]; while (state.keepRunning()) { // Copy the array with timing disabled to measure only the algorithm // itself. state.pauseTiming(); listToSort = Arrays.copyOf(unsorted, 10000); state.resumeTiming(); // Sort the array in place and measure how long it takes. SortingAlgorithms.quickSort(listToSort); } // Assert only once, not to add overhead to the benchmarks. assertTrue(SortingAlgorithmsKt.isSorted(listToSort)); }
حاوِل تقليل مقدار العمل الذي يتم تنفيذه داخل الكتلة measureRepeated
وداخل runWithTimingDisabled
. يتم تنفيذ حظر measureRepeated
عدة مرات، ويمكن أن يؤثر ذلك في الوقت الإجمالي اللازم لتنفيذ مقياس الأداء. إذا كنت بحاجة إلى التحقّق من بعض نتائج مقياس الأداء، يمكنك تأكيد النتيجة الأخيرة بدلاً من إجراء ذلك في كل تكرار لمقياس الأداء.
تشغيل مقياس الأداء
في "استوديو Android"، شغِّل اختبار الأداء كما تفعل مع أي @Test
باستخدام إجراء
الهامش بجانب فئة الاختبار أو الطريقة، كما هو موضّح في الشكل 3.

بدلاً من ذلك، يمكنك تشغيل connectedCheck
من سطر الأوامر لتشغيل جميع الاختبارات من وحدة Gradle المحدّدة:
./gradlew benchmark:connectedCheck
أو اختبار واحد:
./gradlew benchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.benchmark.SampleBenchmark#benchmarkSomeWork
نتائج قياس الأداء
بعد تشغيل اختبار Microbenchmark بنجاح، يتم عرض المقاييس مباشرةً في Android Studio، ويتوفّر تقرير كامل عن الأداء يتضمّن مقاييس إضافية ومعلومات عن الجهاز بتنسيق JSON.

يتم أيضًا تلقائيًا نسخ تقارير JSON وأي آثار لتحديد المشاكل من الجهاز إلى المضيف. تتم كتابة هذه السجلّات على الجهاز المضيف في الموقع التالي:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
يتم تلقائيًا كتابة تقرير JSON على القرص على الجهاز في مجلد الوسائط المشتركة الخارجية لحزمة APK الخاصة بالاختبار، والذي يقع عادةً في /storage/emulated/0/Android/media/**app_id**/**app_id**-benchmarkData.json
.
أخطاء في الإعدادات
ترصد المكتبة الشروط التالية لضمان إعداد مشروعك وبيئتك بشكل يتيح الحصول على أداء دقيق عند الإصدار:
- تم ضبط خيار "قابل للتصحيح" على
false
. - يجب استخدام جهاز فعلي، لأنّ أدوات المحاكاة غير متوافقة.
- يتم قفل الساعات إذا تم تحديد جذر الجهاز.
- يجب أن يكون مستوى شحن البطارية في الجهاز %25 على الأقل.
إذا تعذّر اجتياز أي من عمليات التحقّق السابقة، سيسجّل مقياس الأداء خطأً لتثبيط القياسات غير الدقيقة.
لكتم أنواع أخطاء معيّنة كتحذيرات ومنعها من إيقاف معيار الأداء، مرِّر نوع الخطأ في قائمة مفصولة بفواصل إلى وسيطة أداة القياس androidx.benchmark.suppressErrors
.
يمكنك ضبط ذلك من نص Gradle البرمجي، كما هو موضّح في المثال التالي:
Kotlin
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Groovy
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
يمكنك أيضًا إيقاف عرض الأخطاء من سطر الأوامر:
$ ./gradlew :benchmark:connectedCheck -P andoidtestInstrumentationRunnerArguments.androidx.benchmark.supperssErrors=DEBUGGABLE,LOW-BATTERY
يسمح تجاهل الأخطاء بتشغيل مقياس الأداء في حالة إعداد غير صحيح، ويتم إعادة تسمية ناتج مقياس الأداء عمدًا من خلال إضافة اسم الاختبار إلى الخطأ. على سبيل المثال، يؤدي تشغيل مقياس أداء قابل للتصحيح مع عملية الإيقاف المؤقت في المقتطف السابق إلى إضافة DEBUGGABLE_
إلى بداية أسماء الاختبارات.
أفلام مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون JavaScript غير مفعّلة
- كتابة اختبار Macrobenchmark
- إنشاء اختبارات الأداء الدقيق بدون Gradle
- إنشاء ملفات Baseline Profiles {:#creating-profile-rules}