بهینه سازی هدایت شده توسط پروفایل

بهینه سازی هدایت شده پروفایل (PGO) یک تکنیک بهینه سازی کامپایلر شناخته شده است. در PGO، نمایه‌های زمان اجرا از اجرای برنامه توسط کامپایلر برای انتخاب بهینه در مورد طرح‌بندی کد و خط‌بندی استفاده می‌شود. این منجر به بهبود عملکرد و کاهش حجم کد می شود.

PGO را می توان با مراحل زیر در برنامه یا کتابخانه شما مستقر کرد: 1. بار کاری نماینده را شناسایی کنید. 2. پروفایل ها را جمع آوری کنید. 3. از پروفایل ها در یک نسخه Release استفاده کنید.

مرحله 1: حجم کاری نماینده را شناسایی کنید

ابتدا یک معیار یا حجم کاری نماینده برای برنامه خود مشخص کنید. این یک مرحله حیاتی است زیرا نمایه‌های جمع‌آوری‌شده از حجم کار، مناطق گرم و سرد را در کد شناسایی می‌کنند. هنگام استفاده از پروفایل ها، کامپایلر بهینه سازی های تهاجمی و inlining را در مناطق داغ انجام می دهد. کامپایلر همچنین ممکن است انتخاب کند که اندازه کد نواحی سرد را در حین معامله کردن با عملکرد کاهش دهد.

شناسایی حجم کاری خوب نیز برای پیگیری عملکرد به طور کلی مفید است.

مرحله 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-samples/tree/pgo/pgo یک نسخه آزمایشی پایان به انتها برای استفاده از PGO از یک برنامه را نشان می دهد. جزئیات بیشتری را ارائه می دهد که در این سند بررسی شده است.

  • قوانین ساخت CMake نشان می دهد که چگونه یک متغیر CMake را تنظیم کنید که کد بومی را با ابزار دقیق می سازد. زمانی که متغیر ساخت تنظیم نشده باشد، کد بومی با استفاده از نمایه‌های PGO تولید شده قبلی بهینه می‌شود.
  • در یک ساخت ابزاری، pgodemo.cpp می نویسد که نمایه ها دارای حجم کاری هستند.
  • یک مکان قابل نوشتن برای پروفایل ها در زمان اجرا در MainActivity.kt با استفاده از applicationContext.cacheDir.toString() بدست می آید.
  • برای بیرون کشیدن پروفایل ها از دستگاه بدون نیاز به adb root ، از دستور adb در اینجا استفاده کنید.
،

بهینه سازی هدایت شده پروفایل (PGO) یک تکنیک بهینه سازی کامپایلر شناخته شده است. در PGO، نمایه‌های زمان اجرا از اجرای برنامه توسط کامپایلر برای انتخاب بهینه در مورد طرح‌بندی کد و خط‌بندی استفاده می‌شود. این منجر به بهبود عملکرد و کاهش حجم کد می شود.

PGO را می توان با مراحل زیر در برنامه یا کتابخانه شما مستقر کرد: 1. بار کاری نماینده را شناسایی کنید. 2. پروفایل ها را جمع آوری کنید. 3. از پروفایل ها در یک نسخه Release استفاده کنید.

مرحله 1: حجم کاری نماینده را شناسایی کنید

ابتدا یک معیار یا حجم کاری نماینده برای برنامه خود مشخص کنید. این یک مرحله حیاتی است زیرا نمایه‌های جمع‌آوری‌شده از حجم کار، مناطق گرم و سرد را در کد شناسایی می‌کنند. هنگام استفاده از پروفایل ها، کامپایلر بهینه سازی های تهاجمی و inlining را در مناطق داغ انجام می دهد. کامپایلر همچنین ممکن است انتخاب کند که اندازه کد نواحی سرد را در حین معامله کردن با عملکرد کاهش دهد.

شناسایی حجم کاری خوب نیز برای پیگیری عملکرد به طور کلی مفید است.

مرحله 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-samples/tree/pgo/pgo یک نسخه آزمایشی پایان به انتها برای استفاده از PGO از یک برنامه را نشان می دهد. جزئیات بیشتری را ارائه می دهد که در این سند بررسی شده است.

  • قوانین ساخت CMake نشان می دهد که چگونه یک متغیر CMake را تنظیم کنید که کد بومی را با ابزار دقیق می سازد. زمانی که متغیر ساخت تنظیم نشده باشد، کد بومی با استفاده از نمایه‌های PGO تولید شده قبلی بهینه می‌شود.
  • در یک ساخت ابزاری، pgodemo.cpp می نویسد که نمایه ها دارای حجم کاری هستند.
  • یک مکان قابل نوشتن برای پروفایل ها در زمان اجرا در MainActivity.kt با استفاده از applicationContext.cacheDir.toString() بدست می آید.
  • برای بیرون کشیدن پروفایل ها از دستگاه بدون نیاز به adb root ، از دستور adb در اینجا استفاده کنید.
،

بهینه سازی هدایت شده پروفایل (PGO) یک تکنیک بهینه سازی کامپایلر شناخته شده است. در PGO، نمایه‌های زمان اجرا از اجرای برنامه توسط کامپایلر برای انتخاب بهینه در مورد طرح‌بندی کد و خط‌بندی استفاده می‌شود. این منجر به بهبود عملکرد و کاهش حجم کد می شود.

PGO را می توان با مراحل زیر در برنامه یا کتابخانه شما مستقر کرد: 1. بار کاری نماینده را شناسایی کنید. 2. پروفایل ها را جمع آوری کنید. 3. از پروفایل ها در یک نسخه Release استفاده کنید.

مرحله 1: حجم کاری نماینده را شناسایی کنید

ابتدا یک معیار یا حجم کاری نماینده برای برنامه خود مشخص کنید. این یک مرحله حیاتی است زیرا نمایه‌های جمع‌آوری‌شده از حجم کار، مناطق گرم و سرد را در کد شناسایی می‌کنند. هنگام استفاده از پروفایل ها، کامپایلر بهینه سازی های تهاجمی و inlining را در مناطق داغ انجام می دهد. کامپایلر همچنین ممکن است انتخاب کند که اندازه کد نواحی سرد را در حین معامله کردن با عملکرد کاهش دهد.

شناسایی حجم کاری خوب نیز برای پیگیری عملکرد به طور کلی مفید است.

مرحله 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-samples/tree/pgo/pgo یک نسخه آزمایشی پایان به انتها برای استفاده از PGO از یک برنامه را نشان می دهد. جزئیات بیشتری را ارائه می دهد که در این سند بررسی شده است.

  • قوانین ساخت CMake نشان می دهد که چگونه یک متغیر CMake را تنظیم کنید که کد بومی را با ابزار دقیق می سازد. زمانی که متغیر ساخت تنظیم نشده باشد، کد بومی با استفاده از نمایه‌های PGO تولید شده قبلی بهینه می‌شود.
  • در یک ساخت ابزاری، pgodemo.cpp می نویسد که نمایه ها دارای حجم کاری هستند.
  • یک مکان قابل نوشتن برای پروفایل ها در زمان اجرا در MainActivity.kt با استفاده از applicationContext.cacheDir.toString() بدست می آید.
  • برای بیرون کشیدن پروفایل ها از دستگاه بدون نیاز به adb root ، از دستور adb در اینجا استفاده کنید.
،

بهینه سازی هدایت شده پروفایل (PGO) یک تکنیک بهینه سازی کامپایلر شناخته شده است. در PGO، نمایه‌های زمان اجرا از اجرای برنامه توسط کامپایلر برای انتخاب بهینه در مورد طرح‌بندی کد و خط‌بندی استفاده می‌شود. این منجر به بهبود عملکرد و کاهش حجم کد می شود.

PGO را می توان با مراحل زیر در برنامه یا کتابخانه شما مستقر کرد: 1. بار کاری نماینده را شناسایی کنید. 2. پروفایل ها را جمع آوری کنید. 3. از پروفایل ها در یک نسخه Release استفاده کنید.

مرحله 1: حجم کاری نماینده را شناسایی کنید

ابتدا یک معیار یا حجم کاری نماینده برای برنامه خود مشخص کنید. این یک مرحله حیاتی است زیرا نمایه‌های جمع‌آوری‌شده از حجم کار، مناطق گرم و سرد را در کد شناسایی می‌کنند. هنگام استفاده از پروفایل ها، کامپایلر بهینه سازی های تهاجمی و inlining را در مناطق داغ انجام می دهد. کامپایلر همچنین ممکن است انتخاب کند که اندازه کد نواحی سرد را در حین معامله کردن با عملکرد کاهش دهد.

شناسایی حجم کاری خوب نیز برای پیگیری عملکرد به طور کلی مفید است.

مرحله 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-samples/tree/pgo/pgo یک نسخه آزمایشی پایان به انتها برای استفاده از PGO از یک برنامه را نشان می دهد. جزئیات بیشتری را ارائه می دهد که در این سند بررسی شده است.

  • قوانین ساخت CMake نشان می دهد که چگونه یک متغیر CMake را تنظیم کنید که کد بومی را با ابزار دقیق می سازد. زمانی که متغیر ساخت تنظیم نشده باشد، کد بومی با استفاده از نمایه‌های PGO تولید شده قبلی بهینه می‌شود.
  • در یک ساخت ابزاری، pgodemo.cpp می نویسد که نمایه ها دارای حجم کاری هستند.
  • یک مکان قابل نوشتن برای پروفایل ها در زمان اجرا در MainActivity.kt با استفاده از applicationContext.cacheDir.toString() بدست می آید.
  • برای بیرون کشیدن پروفایل ها از دستگاه بدون نیاز به adb root ، از دستور adb در اینجا استفاده کنید.