أمثلة على قياس الأداء وتحليله

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

تصحيح أخطاء بدء تشغيل التطبيق باستخدام systrace

عند تصحيح أخطاء وقت البدء، ننصح باستخدام سجلات systrace. Systrace هو نظام يستخدم التعليمات البرمجية المضبوطة مسبقًا لاستنتاج المدة التي تستغرقها بعض الأحداث عند حدوثها. تتيح لك عمليات التتبع هذه معرفة ما يحدث في تطبيقك، أو حتى في عمليات أخرى عبر النظام. يحتوي نظام Android الأساسي ومكتبات Jetpack على أدوات تتعلّق بالعديد من الأحداث الرئيسية في التطبيق، ويتم تسجيلها وفقًا لذلك. يمكنك أيضًا توجيه تطبيقاتك باستخدام أنشطة التتبّع المخصّصة الخاصة بك، والتي ستظهر في أدوات التمثيل البصري لبيانات النظام نفسها، لإعطاء صورة عامة عمّا حدث في التطبيق.

استخدام systrace أو Perfetto

للحصول على مزيد من المعلومات عن الاستخدام الأساسي لتتبُّع النظام، يمكنك مشاهدة الفيديو التالي: تصحيح أخطاء أداء التطبيق.

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

مراحل بدء تشغيل التطبيق هي:

  • بدء العملية
  • إعداد كائنات التطبيق العامة
  • إنشاء النشاط وتهيئته
  • تضخيم التنسيق
  • رسم الإطار الأول

تتضمن أنواع الشركات الناشئة المراحل التالية:

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

ننصحك بالتقاط النظام باستخدام تطبيق تتبُّع النظام على الجهاز والمتوفّر في "خيارات المطوّرين". إذا كنت تريد استخدام أدوات سطر الأوامر، تتوفّر Perfetto للاستخدام مع نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث، في حين يجب أن تستخدم الأجهزة التي تعمل بإصدارات سابقة نظام systrace.

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

ننصحك بتضمين مكالمة reportFullyDrawn (المتاحة على نظام التشغيل Android 10 والإصدارات الأحدث) عند اكتمال بدء التشغيل من منظور التطبيق.

إليك بعض الأمور التي يجب البحث عنها في عمليات تتبُّع النظام هذه:

مراقبة التنافس
الشكل 1. يمكن أن يؤدي التنافس على الموارد المحمية على الشاشة إلى تأخير كبير في بدء تشغيل التطبيق.

معاملات الحافظ المتزامن
الشكل 2. ابحث عن المعاملات غير الضرورية في المسار الحرج لتطبيقك.

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

وحدات الإدخال والإخراج عند بدء التشغيل
الشكل 4. تحقق من I/O أثناء بدء التشغيل وابحث عن الأكشاك الطويلة.

في الرسم 4، لاحِظ أنّ العمليات الأخرى التي يتم إجراؤها باستخدام وحدات الإدخال والإخراج في الوقت نفسه يمكن أن تؤدي إلى تزايد الطلب على وحدات الإدخال والإخراج، لذا تأكَّد من عدم تنفيذ العمليات الأخرى.

يمكن أن يتداخل النشاط الكبير في سلاسل المحادثات الأخرى مع مؤشر ترابط واجهة المستخدم، لذا انتبِه إلى العمل في الخلفية أثناء بدء التشغيل. يُرجى ملاحظة أنّ الأجهزة قد يكون لها إعدادات مختلفة لوحدة المعالجة المركزية (CPU)، لذلك يمكن أن يختلف عدد سلاسل التعليمات التي يمكن تشغيلها بشكل موازي على الأجهزة المختلفة.

يمكنك أيضًا الاطّلاع على دليل المصادر الشائعة للبيانات غير المرغوب فيها.

استخدام محلّل الذاكرة في "استوديو Android"

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

لإصلاح مشاكل الذاكرة في تطبيقك، يمكنك استخدام محلّل الذاكرة لتتبُّع سبب عدد مرات حدوث تجميع غير مهم، وتحديد ما إذا كان هناك تسرّب محتمل للذاكرة يؤدي إلى زيادة كومة الذاكرة المؤقتة بشكل مستمر بمرور الوقت.

يتم تقسيم ذاكرة التطبيق إلى الخطوات التالية:

1. اكتشاف مشاكل الذاكرة

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

زيادة عدد العناصر
الشكل 5. محلّل الذاكرة الذي يُظهر توزيعات متزايدة للكائنات بمرور الوقت.

خدمات تجميع القمامة
الشكل 6. محلّل الذاكرة الذي يعرض أحداث جمع البيانات غير الصحيحة.{.:image-caption}

بمجرد تحديد حالة استخدام تضيف ضغط الذاكرة، ابدأ في التحليل بحثًا عن الأسباب الجذرية.

2. تشخيص النقاط الساخنة لضغط الذاكرة

حدد نطاقًا في المخطط الزمني لتصور عمليات التوزيع والحجم السطحي.

عرض عمليات التوزيع والحجم السطحي
الشكل 7. محلّل الذاكرة الذي يُظهر التخصيصات والأحجام لنطاق محدد في الجدول الزمني.

هناك عدة طرق لفرز هذه البيانات. تقدم الأقسام التالية بعض الأمثلة على كيفية مساعدة كل طريقة عرض في تحليل المشكلات.

الترتيب حسب الفئة

يعد الترتيب حسب الفئة مفيدًا عندما تريد العثور على فئات تنشئ كائنات والتي يجب تخزينها مؤقتًا أو إعادة استخدامها من تجمع ذاكرة.

على سبيل المثال، تخيل أنك ترى تطبيقًا ينشئ 2000 كائن من فئة يسمى "Vertex" كل ثانية. سيؤدي ذلك إلى زيادة عدد عمليات التخصيص بمقدار 2000 كل ثانية، كما ستراها عند الفرز حسب الفئة. هل ينبغي إعادة استخدام هذه الكائنات لتجنب إنشاء تلك البيانات غير الضرورية؟ إذا كانت الإجابة بنعم، فمن المحتمل أن تكون هناك حاجة إلى تنفيذ تجميع ذاكرة.

الترتيب حسب تكدس المكالمات

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

الحجم الضحل مقابل الحجم المحتفظ به

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

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

تفريغ الذاكرة بالكامل
الشكل 8. يمكنك إنشاء تفريغ ذاكرة في أي وقت من خلال النقر على زر تفريغ Java للذاكرة في شريط أدوات محلّل الذاكرة.

تمت إضافتها كعمود.
الشكل 9. عند إنشاء تفريغ من الذاكرة، يتم عرض عمود يوضح تخصيصات الكائنات في كومة الذاكرة المؤقتة هذه.

3. قياس تأثير التحسين

يتمثل أحد تحسينات تحسين الذاكرة التي يسهل قياسها في جمع البيانات المهمة. عندما يقلل التحسين من ضغط الذاكرة، من المفترض أن تلاحظ انخفاضًا في مجموعات البيانات المهملة (GCs). لقياس ذلك، قم بقياس الوقت بين تجميع البيانات المهملة في المخطط الزمني للمحلِّل. من المفترض أن تظهر فترات زمنية أطول بين تجميع البيانات المهملة بعد تحسينات الذاكرة.

التأثير النهائي لتحسينات الذاكرة مثل هذه هي:

  • سيتم إغلاق التطبيق بمعدل أقل بسبب مشكلات "نفاد الذاكرة" إذا كان التطبيق لا يعاني من ضغط مستمر في الذاكرة.
  • ويؤدي انخفاض كمية تجميع البيانات المهملة إلى تحسين مقاييس البيانات غير الدقيقة. وذلك لأنّ وحدات تجميع البيانات المهملة (GC) تسبب تزايد تجميع البيانات في وحدة المعالجة المركزية (CPU)، ما قد يؤدي إلى تأجيل مهام العرض أثناء حدوث عملية تجميع البيانات المهملة (GC).