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:
- Profil ve eşleme dosyası oluştur
- Profillerden ve eşleme dosyasından sipariş dosyası oluştur
- 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:
- Sipariş dosyasını yazan, enstrümanlı bir uygulamanın sürümünü oluşturma
- Profilleri oluşturmak için uygulamayı çalıştırın
- 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.
- Profili oluşturulan birçok paylaşılan kitaplık nedeniyle
- 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.