التحسين المستند إلى الملف الشخصي

التحسين الموجّه للملف الشخصي (PGO) هو تحسين برنامج تجميع معروف . في 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 إلى برنامج التجميع والرابط. تشير رسالة الأشكال البيانية حتى مع تطور التعليمات البرمجية، حيث يمكن للمحول البرمجي للواجهة عدم تطابق طفيف بين المصدر والملفات الشخصية.

ملاحظة: بشكل عام، في معظم المكتبات، تكون الملفات الشخصية شائعة عبر البُنى الأساسية. على سبيل المثال، يمكن استخدام الملفات الشخصية التي تم إنشاؤها من إصدار مجموعة التجربة في المكتبة مع جميع البُنى. لكن يُرجى الانتباه إلى أنه إذا كانت هناك أهداف مسارات الرموز البرمجية في المكتبة (الذراع مقابل x86 أو 32 بت مقابل 64 بت)، وملفات شخصية منفصلة لكل إعداد من هذه الإعدادات.

خلاصة ما سبق ذكره

https://github.com/DanAlbert/ndk-عيّنات/tree/pgo/pgo عرضًا توضيحيًا شاملاً لاستخدام PGO من أحد التطبيقات. يوفر المزيد من التفاصيل التي تم استعراضها في هذا المستند.

  • إصدار CMake القواعد توضيح كيفية إعداد متغير CMake الذي ينشئ رمزًا أصليًا باستخدام الأدوات. في حال عدم ضبط متغيّر الإصدار، يتم تحسين الرمز الأصلي باستخدام ملفات PGO الشخصية.
  • في إصدار آلي، pgodemo.cpp تكتب الملفات الشخصية هي تنفيذ عبء العمل.
  • يتم الحصول على موقع قابل للكتابة للملفات الشخصية في وقت التشغيل في MainActivity.kt باستخدام applicationContext.cacheDir.toString().
  • لسحب ملفات شخصية من الجهاز بدون الحاجة إلى adb root، استخدِم adb وصفة الطعام هنا