التحسين الموجّه إلى الملف الشخصي (PGO) هو أسلوب معروف أيضًا لتحسين برامج التجميع. في ميزة "تحسين الأداء من خلال تحليل الأداء"، يستخدم المُجمِّع ملفات تعريف وقت التشغيل من عمليات تنفيذ البرنامج لإجراء خيارات مثالية بشأن تضمين التعليمات البرمجية وتنسيقها. يؤدّي ذلك إلى تحسين الأداء وتقليل حجم الرمز البرمجي.
يمكن نشر PGO إلى تطبيقك أو مكتبتك من خلال الخطوات التالية: 1. حدد عبء العمل التمثيلي. 2- جمع الملفات الشخصية 3- استخدام الملفات الشخصية في إصدار الإصدار
الخطوة 1: تحديد حجم عمل نموذجي
أولاً، حدِّد معيارًا ممثّلاً أو حجم عمل لتطبيقك. تعد هذه خطوة مهمة حيث تحدد الملفات الشخصية التي تم جمعها من عبء العمل المناطق الساخنة والباردة في التعليمة البرمجية. عند استخدام الملفات الشخصية، سينفِّذ المُجمِّع تحسينات مكثّفة وعمليات تضمين في المناطق التي تُستخدم بشكل كبير. قد يختار برنامج التحويل البرمجي أيضًا تقليل حجم التعليمات البرمجية للمناطق الباردة مع مقايضة الأداء.
يعد تحديد عبء عمل جيد مفيدًا أيضًا لتتبع الأداء بشكل عام.
الخطوة 2: جمع الملفات الشخصية
تتضمن عملية جمع الملفات الشخصية ثلاث خطوات: - إنشاء رمز برمجي أصلي باستخدام الأدوات، - تشغيل تطبيق الأداة على الجهاز وإنشاء الملفات الشخصية، - دمج/معالجة الملفات الشخصية على المضيف.
إنشاء إصدار آلي
يتم جمع الملفات الشخصية عن طريق تشغيل عبء العمل من الخطوة 1 في
إصدار مساعِد للتطبيق. لإنشاء إصدار تمّت تهيئته، أضِف -fprofile-generate
إلى علامات المُجمِّع والرابط. يجب أن يتم التحكّم في هذه العلامة
باستخدام متغيّر إنشاء منفصل لأنّ العلامة غير مطلوبة أثناء عملية الإنشاء
التلقائية.
إنشاء الملفات الشخصية
بعد ذلك، شغِّل تطبيق قياس حالة التطبيق على الجهاز وأنشئ ملفات شخصية.
يتم جمع الملفات الشخصية في الذاكرة عند تشغيل الملف الثنائي الذي تم فحصه، ويتم
كتابتها في ملف عند الخروج. ومع ذلك، لا يتم
استدعاء الدوالّ المسجّلة باستخدام atexit
في تطبيق Android، بل يتم إغلاق التطبيق فقط.
على التطبيق أو حمولة العمل تنفيذ عمل إضافي لضبط مسار لملف الملف الشخصي ثم بدء عملية كتابة ملف التعريف بشكل صريح.
- لضبط مسار ملف الملف الشخصي، اتصل بالرقم
__llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw
. يكون الخيار%m
مفيدًا عند توفُّر عدة مكتبات مشتركة. يتم توسيع%m
إلى توقيع فريد لوحدة هذه المكتبة، ما يؤدي إلى إنشاء ملف شخصي منفصل لكل مكتبة. يمكنك الاطّلاع على هذا الرابط للحصول على معلومات عن محددات الأنماط المفيدة الأخرى.PROFILE_DIR
هو دليل قابل للكتابة من التطبيق. يُرجى الاطّلاع على العرض التوضيحي لاكتشاف هذا الدليل في وقت التشغيل. - ولتفعيل كتابة الملف الشخصي بشكل صريح، يمكنك طلب الدالة
__llvm_profile_write_file
.
extern "C" {
extern int __llvm_profile_set_filename(const char*);
extern int __llvm_profile_write_file(void);
}
#define PROFILE_DIR "<location-writable-from-app>"
void workload() {
// ...
// run workload
// ...
// set path and write profiles after workload execution
__llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw");
__llvm_profile_write_file();
return;
}
ملاحظة: يكون إنشاء ملف الملف الشخصي أسهل إذا كانت حمولة العمل ملفًا ثنائيًا مستقلاً.
ما عليك سوى ضبط متغيّر البيئة LLVM_PROFILE_FILE
على %t/default-%m.profraw
قبل تشغيل الملف الثنائي.
الملفات الشخصية للمعالجة اللاحقة
تكون ملفات الملف الشخصي بتنسيق .profraw. ويجب جلبها أولاً من الجهاز باستخدام adb pull
بعد الجلب، استخدِم الأداة llvm-profdata
في NDK للتحويل من .profraw
إلى .profdata
، والتي يمكن تمريرها بعد ذلك إلى أداة التجميع.
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-profdata \
merge --output=pgo_profile.profdata \
<list-of-profraw-files>
استخدِم llvm-profdata
وclang
من إصدار NDK نفسه لتجنُّب عدم تطابق نسخة تنسيقات ملفات الملف الشخصي.
الخطوة 3: استخدام الملفات الشخصية لإنشاء التطبيق
استخدِم الملف الشخصي من الخطوة السابقة أثناء إنشاء إصدار من
تطبيقك من خلال تمرير -fprofile-use=<>.profdata
إلى المُجمِّع والرابط. ويمكن استخدام الملفات الشخصية حتى مع تطوّر الرمز، حيث يتحمّل المحول البرمجي Clang
عدم تطابق طفيف بين المصدر والملفات الشخصية.
ملاحظة: بشكل عام، في معظم المكتبات، تكون الملفات الشخصية شائعة عبر البُنى الأساسية. على سبيل المثال، يمكن استخدام الملفات الشخصية التي تم إنشاؤها من إصدار Arm64 للمكتبة لجميع البُنى. نود تذكيرك بأنّه في حال توفُّر مسارات تعليمات برمجية خاصة بالبنية في المكتبة (الذراع مقابل x86 أو 32 بت مقابل 64 بت)، يجب استخدام ملفات شخصية منفصلة لكل إعداد من هذا النوع.
خلاصة ما سبق ذكره
يعرض https://github.com/DanAlbert/ndk- sample/tree/pgo/pgo عرضًا توضيحيًا شاملاً لاستخدام PGO من أحد التطبيقات. ويوفر تفاصيل إضافية تم استعراضها في هذا المستند.
- توضِّح قواعد الإنشاء في CMake كيفية إعداد متغيّر CMake الذي ينشئ رمزًا أصليًا باستخدام الأدوات. عندما لا يتم ضبط متغيّر الإصدار، يتم تحسين الرمز الأصلي باستخدام ملفات PGO التي تم إنشاؤها مسبقًا.
- في إصدار مستند إلى الأداة، يكتب pgodemo.cpp أن الملفات الشخصية هي تنفيذ أعباء العمل.
- يتم الحصول على موقع قابل للكتابة للملفات الشخصية أثناء التشغيل فيملف MainActivity.kt باستخدام
applicationContext.cacheDir.toString()
. - لسحب ملفات شخصية من الجهاز بدون الحاجة إلى
adb root
، يمكنك استخدام وصفةadb
هنا.