Sipariş dosyası, yeni bir bağlayıcı optimizasyon tekniğidir. Bu sipariş dosyaları, işlevleri temsil eden simgeler içeren metin dosyalarıdır. lld gibi bağlayıcılar, işlevleri belirli bir sırada düzenlemek için sipariş dosyalarını kullanır. Sıralı simgeler içeren bu ikili programlar veya kitaplıklar, sayfa hatalarını azaltır ve sembollerin verimli bir şekilde yüklenmesi nedeniyle programın lansman süresini iyileştirme projeye güçlü bir şekilde başlamanız gerekebilir.
Sipariş dosyası özellikleri aşağıdaki üç yöntem kullanılarak uygulamanıza ekleyebilirsiniz: için şu adımları izleyin:
- Profiller ve eşleme dosyası oluşturun
- Profillerden ve eşleme dosyasından sipariş dosyası oluşturma
- Sürüm derlemesi sırasında sembolleri düzenlemek için sipariş dosyasını kullanın
Sipariş Dosyası Oluştur
Sipariş dosyası oluşturmak için üç adım gerekir:
- Uygulamanın, sipariş dosyasını yazan araçlı bir sürümünü derleme
- Profilleri oluşturmak için uygulamayı çalıştırın
- Profilleri ve eşleme dosyasını işleme sonrası
Enstrümanlı Derleme Oluşturma
Profiller, uygulamanın araçlı bir derlemesi çalıştırılarak oluşturulur.
Araçlı bir derleme hem-forder-file-instrumentation
derleyici ve bağlayıcı flag'leri
-mllvm -orderfile-write-mapping=<filename>-mapping.txt
emin olun.
Araç işareti, profil çıkarma için sipariş dosyası enstrümantasyonunu etkinleştirir ve
profil çıkarma için gereken kitaplığı yükler.
Diğer yandan, eşleme işareti yalnızca
İkili program veya kitaplıktaki her işlev için MD5 karması.
Ayrıca, -O0
dışında tüm optimizasyon işaretlerini ilettiğinizden emin olun çünkü hem
enstrümantasyon bayrağı ve harita çıkarma bayrağı için bir tane gerekir.
Optimizasyon işareti geçilmezse eşleme dosyası oluşturulmaz ve
araçlı derleme, profil dosyasına yanlış karmalar gönderebilir.
ndk-kurum
Derlemenin optimizasyon kullanması için APP_OPTIM=release
ile derleme yaptığınızdan emin olun
-O0
dışında bir moddasınız. AGP ile derleme yaparken bu, yayınlama için otomatiktir
inşa eder.
LOCAL_CFLAGS += \
-forder-file-instrumentation \
-mllvm -orderfile-write-mapping=mapping.txt \
LOCAL_LDFLAGS += -forder-file-instrumentation
CMake
CMake, Debug
dışında bir CMAKE_BUILD_TYPE
kullandığınızdan emin olun.
-O0
dışında bir optimizasyon modu seçin. AGP ile derleme sırasında otomatik olarak
yeni bir model
oluşturmak.
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
Kodunuzu -forder-file-instrumentation -O1 -mllvm
-orderfile-write-mapping=mapping.txt
kullanarak derleyin.
-O1
özellikle gerekli değildir, ancak -O0
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 flag'ler gerekli değildir, bu nedenle oluşturmak için kullanabilirsiniz. Kolaylık sağlaması açısından, tüm bunları aşağıdaki örnek.
Sipariş Dosyası Kitaplığı Oluşturma
İşaretlemelere ek olarak, profil dosyasının oluşturulması ve izlemesi sırasında açıkça bir profil yazma işlemini tetiklemesi gerekir. birkaç adım var.
__llvm_profile_set_filename(PROFILE_DIR "/<filename>-%m.profraw")
adlı kişiyi şunun için arayın: profil yolunu ayarlama hakkında konuştuk. İletilen bağımsız değişken<filename>-%m.profraw
, profil dosyası şu şekilde kaydedildi:<filename>-%m.profraw.order
.PROFILE_DIR
uygulamasının uygulama tarafından yazılabilir olduğundan emin olun ve dizine erişiminiz olur.- Profili oluşturulan çok sayıda paylaşılan kitaplık nedeniyle
%m
, kitaplık için benzersiz bir modül imzasına genişler ve sonuç olarak her kitaplık için ayrı profil oluşturabilirsiniz. Daha fazla kalıp tanımlayıcı için bu bağlantıyı ziyaret edin.
- Profili oluşturulan çok sayıda paylaşılan kitaplık nedeniyle
- Profil dosyasını oluşturmak için
__llvm_profile_initialize_file()
adlı kişiyi arayın - Profil dosyasına açıkça yazmak için
__llvm_orderfile_dump()
öğesini çağırın
Profiller bellekte toplanır ve döküm işlevi bunları dosyası olarak kaydedebilirsiniz. Döküm işlevinin başlatmanın sonunda çağrıldığından emin olmanız gerekir Bu nedenle, profil dosyanız girişimin sonuna kadar tüm simgeleri içerir.
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
Test etmek için araçlı uygulamayı fiziksel veya sanal cihazda çalıştırarak
profil.
adb pull
kullanarak profil dosyalarını ayıklayabilirsiniz.
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 belirtildiği gibi, yazılı profil dosyasını içeren klasörün sizin tarafınızdan erişilebilir. Sanal bir cihaz kullanıyorsanız Play Store'daki emülatörlerden kaçınmak isteyebilirsiniz. çok sayıda klasöre erişimi olmadığından.
Profil ve Eşleme Dosyasını Son İşle
Profilleri aldığınızda, eşleme dosyasını bulmanız ve dönüştürmeniz onaltılık biçimde sunulur. Eşleme dosyasını genellikle uygulamanın derleme klasöründe bulabilirsiniz. Her ikisine de sahip olduğunuzda, komut dosyamızı kullanabilirsiniz. sipariş dosyası oluşturmak için bir profil dosyası ve doğru eşleme dosyasını almanız gerekir.
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
Senaryo hakkında daha fazla bilgi edinmek isterseniz şu makaleye göz atabilirsiniz: BENİOKU.
Uygulama Derlemek için Sipariş dosyasını kullanma
Bir sipariş dosyası oluşturduktan sonra önceki işaretleri ve
sipariş dosyası işlevlerinden yararlanabilir, çünkü bunlar yalnızca oluşturma adımlarına yöneliktir.
-Wl,--symbol-ordering-file=<filename>.orderfile
adlı kişiyi
derleme ve bağlayıcı işaretleridir.
Bazen semboller bulunamayabilir veya hareket edemeyebilir ve uyarıda bulunur. Bu nedenle,
bu uyarıları önlemek için -Wl,--no-warn-symbol-ordering
değerini geçirebilir.
ndk-kurum
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 \
CMake
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
Kodunuzu -Wl,--symbol-ordering-file=<filename>.orderfile
-Wl,--no-warn-symbol-ordering
kullanarak derleyin.
Daha fazla bilgi için sipariş dosyası örneğine göz atın.
Sipariş dosyası uygulama ayrıntıları
Sipariş dosyaları oluşturmanın ve bunları derleme için kullanmanın birçok yolu vardır. NDK, LLVM'nin yöntemini kullandığından bu yöntem, paylaştığınız C veya C++ için en kullanışlı yöntemdir üzerinde yerel kitaplıklar yaratır. Clang, her işlev adını (simge) alır ve bunun bir MD5 karmasını oluşturur ve bu ilişkiyi bir eşleme dosyasına çıkarır. Bir işlevin MD5 karması, işlevi ilk kez yürütülür. İşlevin sonraki yürütmeleri, MD5 karmasını profil dosyanıza ekleyin. Sonuç olarak, bu sırada işlevin yalnızca ilk yürütmesi kaydedilir. Profil dosyası ve eşleme dosyası üzerinden her bir MD5 karmasını alabilirsiniz ve bunu karşılık gelen fonksiyonla değiştirip bir sipariş dosyası alın.
Hem onaltılık biçimdeki bir profil dosyasına hem de bir eşleme dosyasına örnekler example.prof olarak bulundu ve example-mapping.txt öğelerinin bulunduğu anlamına gelir.