Dosyaları Sipariş Et

Sipariş dosyası, yeni bir bağlayıcı optimizasyon tekniğidir. Bu sipariş dosyaları, işlevleri temsil eden semboller içeren metin dosyalarıdır. lld gibi bağlayıcılar, işlevleri belirli bir sırada düzenlemek için sıra dosyalarını kullanır. Sıralanmış sembollere sahip bu ikili programlar veya kitaplıklar, program baştan başlatılırken simgelerin verimli bir şekilde yüklenmesi nedeniyle sayfa hatalarını azaltır ve programın başlatma süresini iyileştirir.

Sipariş dosyası özellikleri aşağıdaki üç adım uygulanarak uygulamanıza eklenebilir:

  1. Profil ve eşleme dosyası oluştur
  2. Profillerden ve eşleme dosyasından sipariş dosyası oluştur
  3. Simgeleri düzenlemek için Sürüm derlemesi sırasında sipariş dosyasını kullanın

Sipariş Dosyası Oluştur

Sipariş dosyası oluşturmak için üç adım gereklidir:

  1. Sipariş dosyasını yazan, enstrümanlı bir uygulamanın sürümünü oluşturma
  2. Profilleri oluşturmak için uygulamayı çalıştırın
  3. Profilleri ve eşleme dosyasını sonradan işleme

Aletli Derleme Oluşturma

Profiller, uygulamanın gelişmiş bir derlemesi çalıştırılarak oluşturulur. Araçlı bir derleme, -forder-file-instrumentation öğesinin hem derleyici hem de bağlayıcı işaretlerine eklenip derleyici bayraklarına kesinlikle -mllvm -orderfile-write-mapping=<filename>-mapping.txt eklenmesini gerektirir. Araçlar işareti, profil oluşturma için sipariş dosyası enstrümantasyonunu etkinleştirir ve profil oluşturma için gereken belirli kitaplığı yükler. Diğer yandan, eşleme işareti yalnızca ikili program veya kitaplıktaki her bir işlevin MD5 karmasını gösteren eşleme dosyasını verir.

Ayrıca, tüm optimizasyon işaretlerini ilettiğinizden emin olun. Ancak -O0 ancak hem araç bayrağı hem de eşleme işareti birer tane gerektirir. Herhangi bir optimizasyon işareti iletilmezse eşleme dosyası oluşturulmaz ve kullanılan derleme, profil dosyasına yanlış karmalar oluşturabilir.

NK-build

ndk-build'in -O0 dışında bir optimizasyon modu kullanması için APP_OPTIM=release ile derleme yaptığınızdan emin olun. AGP ile derleme yaparken bu, sürüm derlemeleri için otomatiktir.

LOCAL_CFLAGS += \
    -forder-file-instrumentation \
    -mllvm -orderfile-write-mapping=mapping.txt \

LOCAL_LDFLAGS += -forder-file-instrumentation

Yapay Zeka

CMake'in -O0 dışında bir optimizasyon modu kullanması için Debug dışında bir CMAKE_BUILD_TYPE kullandığınızdan emin olun. AGP ile derleme yaparken bu, sürüm derlemeleri için otomatiktir.

target_compile_options(orderfiledemo PRIVATE
    -forder-file-instrumentation
    -mllvm -orderfile-write-mapping=mapping.txt
)
target_link_options(orderfiledemo PRIVATE -forder-file-instrumentation)

Diğer derleme sistemleri

-forder-file-instrumentation -O1 -mllvm -orderfile-write-mapping=mapping.txt kullanarak kodunuzu derleyin.

-O1 özellikle gerekli değildir, ancak -O0 işlevini kullanmayın.

Bağlantı oluştururken -mllvm -orderfile-write-mapping=mapping.txt değerini hariç tutun.

Sürüm derlemesi için tüm bu işaretler gerekli değildir. Bu nedenle, derleme değişkeni tarafından kontrol edilmelidir. Basitlik sağlaması açısından, tüm bunları örneğimizdeki gibi CMakeLists.txt dosyasında ayarlayabilirsiniz.

Sipariş Dosyası Kitaplığı Oluşturma

İşaretlere ek olarak, profil dosyasının ayarlanması ve araçlı ikili programın, yürütme sırasında bir profil yazma işlemini açıkça tetiklemesi gerekir.

  • Profil yolunu ayarlamak için __llvm_profile_set_filename(PROFILE_DIR "/<filename>-%m.profraw") numaralı telefonu arayın. İletilen bağımsız değişken <filename>-%m.profraw olsa da profil dosyası <filename>-%m.profraw.order olarak kaydedilir. PROFILE_DIR öğesinin uygulama tarafından yazılabileceğinden ve dizine erişebildiğinizden emin olun.
    • Profili oluşturulan birçok paylaşılan kitaplık nedeniyle %m, kitaplık için benzersiz bir modül imzasına genişleyerek her kitaplık için ayrı bir profil elde edilmesini sağladığından yararlıdır. Daha fazla kalıp tanımlayıcı için bu bağlantıya göz atabilirsiniz.
  • Profil dosyasını oluşturmak için __llvm_profile_initialize_file() numaralı telefonu arayın
  • Açıkça profil dosyasına yazmak için __llvm_orderfile_dump() numaralı telefonu arayın

Profiller bellekte toplanır ve döküm işlevi, bunları dosyaya yazar. Döküm işlevinin, başlatma işleminin sonunda çağrıldığından emin olmanız gerekir. Böylece profil dosyanızda, başlatma sonuna kadar tüm simgeler bulunur.

extern "C" {
extern int __llvm_profile_set_filename(const char*);
extern int __llvm_profile_initialize_file(void);
extern int __llvm_orderfile_dump(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_initialize_file();
  __llvm_orderfile_dump();
  return;
}

Profiller İçin Derlemeyi Çalıştırma

Profilleri oluşturmak için, donanımlı uygulamayı fiziksel veya sanal bir cihazda çalıştırın. Profil dosyalarını adb pull ile çıkarabilirsiniz.

adb shell "run-as <package-name> sh -c 'cat /data/user/0/<package-name>/cache/default-%m.profraw.order' | cat > /data/local/tmp/default-%m.profraw.order"
adb pull /data/local/tmp/default-%m.profraw.order .

Daha önce de belirtildiği gibi, yazılı profil dosyasını içeren klasöre erişebildiğinizden emin olun. Sanal bir cihazsa çok fazla klasöre erişememeniz nedeniyle Play Store emülatörlerinden kaçınmak isteyebilirsiniz.

Profili ve Eşleme Dosyasını İşleme

Profilleri aldığınızda, eşleme dosyasını bulmanız ve her bir profili onaltılık biçime dönüştürmeniz gerekir. Eşleme dosyasını genellikle uygulamanın derleme klasöründe bulabilirsiniz. Her ikisine de sahip olduğunuzda, profil dosyası almak için komut dosyamızı ve bir sipariş dosyası oluşturmak için doğru eşleme dosyasını kullanabilirsiniz.

Linux/Mac/ChromeOS

hexdump -C default-%m.profraw.order > default-%m.prof
python3 create_orderfile.py --profile-file default-%m.prof --mapping-file <filename>-mapping.txt

Windows

certutil -f -encodeHex default-%m.profraw.order default-%m.prof
python3 create_orderfile.py --profile-file default-%m.prof --mapping-file <filename>-mapping.txt

Komut dosyası hakkında daha fazla bilgi edinmek için BENİOKU sayfasına göz atabilirsiniz.

Uygulama Oluşturmak için Sipariş dosyasını kullanma

Bir sipariş dosyası oluşturduktan sonra, önceki işaretleri ve sipariş dosyası işlevlerini kaldırmalısınız, çünkü bunlar yalnızca oluşturma adımlarına yöneliktir. Derleme ve bağlayıcı işaretlerine -Wl,--symbol-ordering-file=<filename>.orderfile iletmeniz yeterlidir. Bazen simgeler bulunamaz veya taşınamaz ve uyarı verir. Bu nedenle, bu uyarıları engellemek için -Wl,--no-warn-symbol-ordering değerini iletebilirsiniz.

NK-build

LOCAL_CFLAGS += \
    -Wl,--symbol-ordering-file=<filename>.orderfile \
    -Wl,--no-warn-symbol-ordering \

LOCAL_LDFLAGS += \
    -Wl,--symbol-ordering-file=<filename>.orderfile \
    -Wl,--no-warn-symbol-ordering \

Yapay Zeka

target_compile_options(orderfiledemo PRIVATE
    -Wl,--symbol-ordering-file=<filename>.orderfile
    -Wl,--no-warn-symbol-ordering
)
target_link_options(orderfiledemo PRIVATE
    -Wl,--symbol-ordering-file=<filename>.orderfile
    -Wl,--no-warn-symbol-ordering
)

Diğer derleme sistemleri

-Wl,--symbol-ordering-file=<filename>.orderfile -Wl,--no-warn-symbol-ordering kullanarak kodunuzu derleyin.

Daha fazla bilgi için sipariş dosyası örneğine göz atın.

Sipariş dosyası uygulama ayrıntıları

Sipariş dosyalarını oluşturmanın ve bunları derlemek için kullanmanın birçok yolu vardır. NDK, LLVM'nin yöntemini kullanır. Bu nedenle, gerçek Java veya Kotlin uygulaması yerine C veya C++ paylaşılan kitaplıklarınız için en kullanışlı yöntemdir. Clang her işlev adını (sembol) alıp bunun bir MD5 karmasını oluşturur ve bu ilişkiyi bir eşleme dosyasına çıkarır. Bir işlevin MD5 karma değeri, işlev ilk kez çalıştırıldığında profil dosyasına (profraw biçimi) yazılır. İşlevin sonraki yürütmeleri, yinelemeleri önlemek istediği için MD5 karmasını profil dosyasına yazmaz. Sonuç olarak, işlev yalnızca ilk çalıştırma sırayla kaydedilir. Profil dosyasını ve eşleme dosyasını gözden geçirerek her bir MD5 karmasını alıp ilgili işlevle değiştirip bir sıra dosyası alabilirsiniz.

Onaltılık biçimli profil dosyası ve eşleme dosyası örnekleri sırasıyla example.prof ve example-mapping.txt olarak bulunabilir.