Dosyaları Sipariş Et

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:

  1. Profiller ve eşleme dosyası oluşturun
  2. Profillerden ve eşleme dosyasından sipariş dosyası oluşturma
  3. 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:

  1. Uygulamanın, sipariş dosyasını yazan araçlı bir sürümünü derleme
  2. Profilleri oluşturmak için uygulamayı çalıştırın
  3. 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.
  • 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.