استخدام ميزة "التحسين المستنِد إلى الملف الشخصي"

يتيح نظام إنشاء Android لنظام التشغيل Android 13 والإصدارات الأقدم استخدام ميزة التحسين بالاستناد إلى الملف الشخصي (PGO) من Clang في وحدات Android الأصلية التي تحتوي على قواعد التصميم لعمليات الإنشاء. توضِّح هذه الصفحة ميزة Clang PGO وكيفية إنشاء ملفات ملفّات الأداء المُستخدَمة في ميزة PGO وتعديلها باستمرار، وكيفية دمج ميزة PGO مع نظام الإنشاء (مع حالة الاستخدام).

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

لمحة عن Clang PGO

يمكن أن يُجري Clang تحسينًا موجّهًا حسب الملف الشخصي باستخدام نوعَين من الملفات الشخصية:

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

يجب إنشاء جميع الملفات الشخصية من خلال ملف عمل تمثيلي يُجري السلوك المعتاد للتطبيق. على الرغم من أنّ Clang يتيح استخدام ملف العمل المستنِد إلى AST (-fprofile-instr-generate) وملف العمل المستنِد إلى LLVM IR (-fprofile-generate))، لا يتيح Android سوى ملف العمل المستنِد إلى LLVM IR لميزة PGO المستنِدة إلى الأدوات.

يجب استخدام العلامات التالية لإنشاء ملف شخصي:

  • -fprofile-generate للأجهزة المستندة إلى الأشعة تحت الحمراء باستخدام هذا الخيار، يستخدم الجزء الخلفي من التطبيق أسلوبًا للحد الأدنى من شجرة الامتداد التي يتمّ فيها تحديد الوزن بهدف تقليل عدد نقاط القياس وتحسين مواضعها في الحواف ذات الوزن المنخفض (استخدِم هذا الخيار لخطوة الربط أيضًا). يُرسِل برنامج تشغيل Clang وقت تشغيل التحليل المتعمّق (libclang_rt.profile-arch-android.a) تلقائيًا إلى أداة الربط. تحتوي هذه المكتبة على إجراءات لكتابة الملفات الشخصية على القرص عند خروج البرنامج.
  • -gline-tables-only لجمع الملفات الشخصية المستندة إلى تحليل العينات لإنشاء الحد الأدنى من معلومات تصحيح الأخطاء

يمكن استخدام ملف شخصي لإجراء تحسين الأداء أثناء التشغيل باستخدام -fprofile-use=pathname أو -fprofile-sample-use=pathname للملفات الشخصية المستندة إلى الأدوات والملفات الشخصية المستندة إلى تحليل عيّنات الأداء على التوالي.

ملاحظة: عند إجراء تغييرات على الرمز، إذا لم يعُد بإمكان Clang استخدام بيانات الملف الشخصي، سيُنشئ تحذيرًا -Wprofile-instr-out-of-date.

استخدام PGO

تشمل خطوات استخدام ميزة "التوفّر بلا إنترنت" ما يلي:

  1. أنشئ المكتبة أو الملف القابل للتنفيذ باستخدام الأدوات من خلال تمرير -fprofile-generate إلى المُجمِّع والرابط.
  2. جمع الملفات الشخصية من خلال تشغيل ملف تعريف نموذجي على ملف ثنائي تم فحصه
  3. عالج الملفات الشخصية بعد إنشائها باستخدام الأداة llvm-profdata (للحصول على التفاصيل، راجِع مقالة معالجة ملفات ملفّات LLVM ملفّات الملفات الشخصية).
  4. استخدِم الملفات الشخصية لتطبيق ميزة "تحسين الأداء من خلال إعادة التشغيل" من خلال تمرير -fprofile-use=<>.profdata إلى المُجمِّع و-fprofile-use=<>.profdata إلى الرابط.

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

جمع الملفات الشخصية

يمكن أن يستخدم Clang الملفات الشخصية التي تم جمعها من خلال تنفيذ معايير الأداء باستخدام ملف برمجي تم تجهيزه بالأدوات اللازمة من المكتبة أو من خلال أخذ عيّنات من عدادات الأجهزة عند تنفيذ ملف برمجي قياس الأداء. في الوقت الحالي، لا يتيح نظام التشغيل Android استخدام ميزة جمع الملفات الشخصية المستندة إلى أخذ العينات، لذا عليك جمع الملفات باستخدام إصدار تم اختباره:

  1. حدِّد مقياس أداء ومجموعة المكتبات التي يستخدمها هذا المقياس بشكل جماعي.
  2. أضِف سمات pgo إلى معايير الأداء والمكتبات (التفاصيل أدناه).
  3. أنشئ إصدارًا من Android يحتوي على نسخة تم اختبارها من هذه المكتبات باستخدام:
    make ANDROID_PGO_INSTRUMENT=benchmark

benchmark هو عنصر نائب يحدِّد مجموعة المكتبات التي تم اختبار أدائها أثناء عملية الإنشاء. إنّ مدخلات الأداء النموذجية (وربما ملف تنفيذي آخر يرتبط بمكتبة يتم قياس أدائها ) ليست خاصة بميزة PGO وتتجاوز نطاق هذا المستند.

  1. وميِّز الإصدار المُزوَّد بالأدوات أو زامِنَه على جهاز.
  2. شغِّل مقياس الأداء لجمع الملفات الشخصية.
  3. استخدِم أداة llvm-profdata (الموضَّحة أدناه) للقيام بالمهام التالية: المعالجة اللاحقة للملفات الشخصية وإعدادها لإضافتها إلى شجرة ملفات المصدر.

استخدام الملفات الشخصية أثناء عملية الإنشاء

تحقَّق من الملفات الشخصية في toolchain/pgo-profiles في شجرة Android. يجب أن يتطابق الاسم مع ما هو محدّد في السمة الفرعية profile_file للسمة pgo الخاصة بالمكتبة. يُرسِل نظام الإنشاء تلقائيًا ملف الملف الشخصي إلى Clang عند إنشاء المكتبة. يمكن ضبط متغيّر البيئة ANDROID_PGO_DISABLE_PROFILE_USE على true لإيقاف ميزة PGO مؤقتًا وقياس فائدتها في الأداء.

لتحديد أدلة الملفات الشخصية الإضافية الخاصة بالمنتجات، يمكنك إلحاقها بملف PGO_ADDITIONAL_PROFILE_DIRECTORIES المتغيّر في BoardConfig.mk. في حال تحديد مسارات إضافية، ستحلّ الملفات الشخصية في هذه المسارات محلّ الملفات في toolchain/pgo-profiles.

عند إنشاء صورة إصدار باستخدام الإصدار dist لملف make، يكتب نظام الإنشاء أسماء ملفات الملفات الشخصية المفقودة في $DIST_DIR/pgo_profile_file_missing.txt. يمكنك الاطّلاع على هذاملف لمعرفة ملفات الملف الشخصي التي تم حذفها عن طريق الخطأ (ما يؤدي إلى إيقاف ميزة PGO بدون إشعار).

تفعيل ميزة PGO في ملفات Android.bp

لتفعيل ميزة "تحسين الأداء أثناء التشغيل" في ملفات Android.bp للوحدات الأصلية، ما عليك سوى تحديد السمة pgo. يحتوي هذا الموقع على المواقع الفرعية التالية:

الموقع الوصف
instrumentation اضبط القيمة على true لميزة "تحسين الأداء أثناء التشغيل" باستخدام الأدوات. القيمة التلقائية هي false.
sampling اضبط القيمة على true لميزة "تحسين الأداء أثناء التشغيل" باستخدام تحليل عيّنات البيانات. القيمة التلقائية هي false.
benchmarks قائمة السلاسل تم إنشاء هذه الوحدة لإنشاء الملفات الشخصية في حال تحديد أي معيار أداء في القائمة في خيار ANDROID_PGO_INSTRUMENT الإصدار.
profile_file ملف الإصدار (بالنسبة إلى toolchain/pgo-profile) لاستخدامه مع أداة PGO يُحذّر عملية الإنشاء من عدم توفّر هذا الملف من خلال إضافة هذاملف إلى $DIST_DIR/pgo_profile_file_missing.txt ما لم يتم ضبط السمة enable_profile_use على false أو يتم ضبط متغيّر الإنشاء ANDROID_PGO_NO_PROFILE_USE على true.
enable_profile_use اضبط القيمة على false إذا لم يكن من المفترض استخدام الملفات الشخصية أثناء مرحلة التصميم. يمكن استخدامها أثناء عملية الإعداد لتفعيل جمع الملفات الشخصية أو لإيقاف ميزة "تحسين الأداء من خلال التشغيل" مؤقتًا. القيمة التلقائية هي true.
cflags قائمة بالعلامات الإضافية لاستخدامها أثناء عملية إنشاء تمّت تهيئتها لقياس الأداء

مثال على وحدة تتضمّن ميزة "تحسين أداء التطبيقات":

cc_library {
    name: "libexample",
    srcs: [
        "src1.cpp",
        "src2.cpp",
    ],
    static: [
        "libstatic1",
        "libstatic2",
    ],
    shared: [
        "libshared1",
    ]
    pgo: {
        instrumentation: true,
        benchmarks: [
            "benchmark1",
            "benchmark2",
        ],
        profile_file: "example.profdata",
    }
}

إذا كانت مقاييس الأداء benchmark1 وbenchmark2 تُظهر سلوكًا تمثيليًا للمكتبات libstatic1 أو libstatic2 أو libshared1، يمكن أن يتضمّن موقع pgo لهذه المكتبات أيضًا مقاييس الأداء. يمكن أن تتضمّن وحدة defaults في Android.bp مواصفة pgo شائعة لمجموعة من المكتبات لتجنّب تكرار قواعد الإنشاء نفسها لعدة وحدات.

لاختيار ملفات ملف شخصي مختلفة أو إيقاف ميزة PGO بشكل انتقائي لبنية معيّنة، حدِّد سمات profile_file وenable_profile_use وcflags لكل بنية. مثال (مع استهداف البنية في الخطّ العريض):

cc_library {
    name: "libexample",
    srcs: [
          "src1.cpp",
          "src2.cpp",
    ],
    static: [
          "libstatic1",
          "libstatic2",
    ],
    shared: [
          "libshared1",
    ],
    pgo: {
         instrumentation: true,
         benchmarks: [
              "benchmark1",
              "benchmark2",
         ],
    }

    target: {
         android_arm: {
              pgo: {
                   profile_file: "example_arm.profdata",
              }
         },
         android_arm64: {
              pgo: {
                   profile_file: "example_arm64.profdata",
              }
         }
    }
}

لحلّ المراجع إلى مكتبة وقت تشغيل الأداء أثناء الأداء المستنِد إلى الأدوات، عليك تمرير علامة الإنشاء -fprofile-generate إلى أداة الربط. يجب أيضًا تجهيز المكتبات الثابتة التي تم تجهيزها باستخدام ميزة PGO، وجميع المكتبات المشتركة، وأي ملف ثنائي يعتمد مباشرةً على المكتبة الثابتة لاستخدام ميزة PGO. ومع ذلك، لا تحتاج مكتبات ملفّات exes أو مكتبات ملفّات shared المشترَكة هذه إلى استخدام ملفات تعريف PGO، ويمكن ضبط سمة enable_profile_use على false. وباستثناء هذا التقييد، يمكنك تطبيق ميزة "تحسين الأداء أثناء التشغيل" على أي مكتبة ثابتة أو مكتبة مشتركة أو ملف قابل للتنفيذ.

التعامل مع ملفات الملف الشخصي لـ LLVM

يؤدي تنفيذ مكتبة أو ملف قابل للتنفيذ تمّت تهيئته إلى إنشاء ملف ملف شخصي باسم default_unique_id_0.profraw في /data/local/tmp (حيث يكون unique_id هو تجزئة رقمية فريدة لهذه المكتبة). إذا كان هذا الملف متوفّرًا من قبل، يدمج وقت تشغيل إنشاء الملفات الشخصية الملف الشخصي الجديد مع الملف الشخصي القديم أثناء كتابة الملفات الشخصية. يُرجى العِلم أنّه لا يمكن لمطوّري التطبيقات استخدام /data/local/tmp، بل عليهم استخدام مكان آخر مثل /storage/emulated/0/Android/data/packagename/files بدلاً من ذلك. لتغيير موقع ملف الملف الشخصي، اضبط متغيّر البيئة LLVM_PROFILE_FILE أثناء التشغيل.

بعد ذلك، يتم استخدام الأداة llvm-profdata لتحويل ملف .profraw (وربما دمج عدة ملفات .profraw) إلى ملف .profdata:

  llvm-profdata merge -output=profile.profdata <.profraw and/or .profdata files>

يمكن بعد ذلك وضع علامة على profile.profdata في شجرة ملف المصدر لاستخدامها أثناء عملية الإنشاء.

في حال تحميل عدة مكتبات أو ملفات ثنائية تم قياس أدائها أثناء إجراء اختبار معياري، تنشئ كل مكتبة ملف .profraw منفصلاً يحتوي على معرّف فريد منفصل. يمكن عادةً دمج كل هذه الملفات في ملف .profdata واحد واستخدامه لإنشاء حِزمة PGO. في الحالات التي يتم فيها اختبار مكتبة باستخدام معيار أداء آخر، يجب تحسين هذه المكتبة باستخدام ملف شخصي من كلا المعيارَين. في هذه الحالة، يكون خيار show في llvm-profdata مفيدًا:

  llvm-profdata merge -output=default_unique_id.profdata default_unique_id_0.profraw
llvm-profdata show -all-functions default_unique_id.profdata

لربط unique_id بالمكتبات الفردية، ابحث في show عن كل unique_id عن اسم دالة فريد للمكتبة.

دراسة حالة: حملة PGO لـ ART

تقدّم الدراسة الحالة ART كمثال ذي صلة، ولكنّها ليست وصفًا دقيقًا للمجموعة الفعلية من المكتبات التي تم إعداد ملفها الشخصي في ART أو الاعتمادات المتبادلة بينها.

يعتمد dex2oat المُجمِّع المُسبَق في ART على libart-compiler.so، والذي يعتمد بدوره على libart.so. يتم تنفيذ وقت تشغيل ART بشكل أساسي في libart.so. ستكون مقاييس الأداء للمجمِّع ووقت التشغيل مختلفة:

Benchmark المكتبات التي تم تحليلها
dex2oat dex2oat (ملف قابل للتنفيذ)، libart-compiler.so، libart.so
art_runtime libart.so
  1. أضِف سمة pgo التالية إلى dex2oat، libart-compiler.so:
        pgo: {
            instrumentation: true,
            benchmarks: ["dex2oat",],
            profile_file: "dex2oat.profdata",
        }
  2. أضِف السمة pgo التالية إلى libart.so:
        pgo: {
            instrumentation: true,
            benchmarks: ["art_runtime", "dex2oat",],
            profile_file: "libart.profdata",
        }
  3. أنشئ إصدارات تمّت قياس أدائها لاختبارَي dex2oat و art_runtime باستخدام:
        make ANDROID_PGO_INSTRUMENT=dex2oat
        make ANDROID_PGO_INSTRUMENT=art_runtime
  4. بدلاً من ذلك، يمكنك إنشاء إصدار واحد تم اختباره يتضمّن جميع المكتبات التي تم اختبارها باستخدام:

        make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime
        (or)
        make ANDROID_PGO_INSTRUMENT=ALL

    ينشئ الأمر الثاني جميع الوحدات المفعَّلة باستخدام ميزة "تحسين الأداء من خلال مراقبة التطبيق" لتحليل الأداء.

  5. يمكنك تنفيذ مقاييس الأداء التي تُجري dex2oat و art_runtime للحصول على ما يلي:
    • ثلاثة ملفات .profraw من dex2oat (dex2oat_exe.profdata dex2oat_libart-compiler.profdata dexeoat_libart.profdata)، تم تحديدها باستخدام الطريقة описанة في معالجة ملفات ملف ملف LLVM.
    • art_runtime_libart.profdata واحدة
  6. أنشئ ملفًا شائعًا لملف profdata الخاص بالملف التنفيذي dex2oat وملف libart-compiler.so باستخدام:
    llvm-profdata merge -output=dex2oat.profdata \
        dex2oat_exe.profdata dex2oat_libart-compiler.profdata
  7. الحصول على الملف الشخصي لـ libart.so من خلال دمج الملفات الشخصية من المقياسَين التاليَين:
    llvm-profdata merge -output=libart.profdata \
        dex2oat_libart.profdata art_runtime_libart.profdata

    قد تكون الأعداد الأولية لـ libart.so من الملفَّين الشخصيَّين مختلفة لأنّ مقاييس الأداء تختلف في عدد حالات الاختبار ومدّة تنفيذها. في هذه الحالة، يمكنك استخدام دمج مرجح:

    llvm-profdata merge -output=libart.profdata \
        -weighted-input=2,dex2oat_libart.profdata \
        -weighted-input=1,art_runtime_libart.profdata

    يحدّد الأمر أعلاه ضعف الأهمية للملف الشخصي من dex2oat. يجب تحديد الوزن الفعلي استنادًا إلى معرفة العميل بالموضوع أو التجارب التي أجراها.

  8. تحقّق من ملفات الملف الشخصي dex2oat.profdata و libart.profdata في toolchain/pgo-profiles للاستخدام أثناء عملية الإنشاء.