Dosyaları Sipariş Et

Sıralama dosyası, son zamanlarda kullanılan 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ıralama dosyalarını kullanır. Sıralı sembollere sahip bu ikili dosyalar veya kitaplıklar, programın soğuk başlatılması sırasında sembollerin verimli bir şekilde yüklenmesi sayesinde sayfa hatalarını azaltır ve programın başlatılma süresini iyileştirir.

Sipariş dosyası özellikleri, üç adımda uygulamanıza eklenebilir:

  1. Profil ve eşleme dosyası oluşturma
  2. Profillerden ve eşleme dosyasından sipariş dosyası oluşturma
  3. Sembolleri yerleştirmek için yayınlanan derleme sırasında sıralama dosyasını kullanın.

Sipariş Dosyası Oluşturma

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

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

Enstrümanlı Derleme Oluşturma

Profiller, uygulamanın enstrümanlı bir derlemesi çalıştırılarak oluşturulur. Enstrümanlı bir derleme için hem derleyiciye hem de bağlayıcı işaretlerine -forder-file-instrumentation eklenmesi gerekir. -mllvm -orderfile-write-mapping=<filename>-mapping.txt ise kesinlikle derleyici işaretlerine eklenmelidir. Enstrümantasyon işareti, profilleme için sipariş dosyası enstrümantasyonunu etkinleştirir ve profilleme için gereken belirli kitaplığı yükler. Diğer yandan, eşleme işareti yalnızca ikili program veya kitaplık içindeki her fonksiyon için MD5 karmasını gösteren eşleme dosyasını verir.

Ayrıca, hem enstrümantasyon işareti hem de eşleme işareti için bir işaret gerektiğinden -O0 dışındaki tüm optimizasyon işaretlerini ilettiğinizden emin olun. Optimizasyon işareti iletilmezse eşleme dosyası oluşturulmaz ve profilleme işlemi yapılan derleme, profil dosyasına yanlış karma değerleri verebilir.

ndk-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 geliştirme yaparken bu, yayın derlemeleri için otomatik olarak yapılır.

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

LOCAL_LDFLAGS += -forder-file-instrumentation

CMake

CMake'in -O0 dışında bir optimizasyon modu kullanması için CMAKE_BUILD_TYPE dışında bir Debug kullandığınızdan emin olun. AGP ile derleme yaparken bu, yayın derlemeleri için otomatik olarak gerçekleşir.

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 kullanmayın.

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

Bu işaretlerin tümü yayınlanan derleme için gerekli değildir. Bu nedenle, bir derleme değişkeni tarafından kontrol edilmelidir. Kolaylık sağlamak için 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 enstrümanlı ikili programın yürütülmesi sırasında profil yazma işlemini açıkça tetiklemesi gerekir.

  • Profil yolunu ayarlamak için __llvm_profile_set_filename(PROFILE_DIR "/<filename>-%m.profraw") ile iletişime geçin. Although the argument passed is <filename>-%m.profraw, the profile file is saved as <filename>-%m.profraw.order. PROFILE_DIR konumunun uygulama tarafından yazılabilir olduğundan ve dizine erişebildiğinizden emin olun.
    • Birçok paylaşılan kitaplık profillendirildiğinden %m, kitaplık için benzersiz bir modül imzasına genişlediği ve kitaplık başına ayrı bir profil oluşturduğu için kullanışlıdır. Daha fazla kalıp belirleyici için bu bağlantıyı inceleyebilirsiniz.
  • Profil dosyasını oluşturmak için __llvm_profile_initialize_file() adlı iş ortağını arayın
  • Profil dosyasına açıkça yazmak için __llvm_orderfile_dump() işlevini çağırın.

Profiller bellekte toplanır ve döküm işlevi bunları dosyaya yazar. Profil dosyanızın başlangıç sonuna kadar tüm sembolleri içermesi için döküm işlevinin başlangıcın sonunda çağrıldığından emin olmanız gerekir.

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 için derlemeyi çalıştırma

Profilleri oluşturmak için enstrümanlı uygulamayı fiziksel veya sanal bir cihazda çalıştırın. adb pull kullanarak profil dosyalarını çı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 cihaz kullanıyorsanız birçok klasöre erişemeyeceğiniz için Play Store'u içeren emülatörleri kullanmaktan kaçınabilirsiniz.

Profili ve eşleme dosyasını sonradan işleme

Profilleri aldığınızda eşleme dosyasını bulmanız ve her profili onaltılık biçime dönüştürmeniz gerekir. Genellikle eşleme dosyasını uygulamanın derleme klasöründe bulabilirsiniz. İkisini de bulduğunuzda, bir profil dosyası ve doğru eşleme dosyasını alıp sıralı dosya oluşturmak için komut dosyamızı 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 isterseniz bu BENİOKU dosyasına göz atabilirsiniz.

Uygulama oluşturmak için sipariş dosyasını kullanma

Sipariş dosyası oluşturduktan sonra, yalnızca oluşturma adımları için kullanılan önceki işaretleri ve sipariş dosyası işlevlerini kaldırmanız gerekir. Derleme ve bağlayıcı işaretlerine -Wl,--symbol-ordering-file=<filename>.orderfile iletmeniz yeterlidir. Semboller bazen bulunamaz veya hareket edemez ve uyarılar verir. Bu nedenle, bu uyarıları bastırmak için -Wl,--no-warn-symbol-ordering sembolünü kullanabilirsiniz.

ndk-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 \

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

-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ı oluşturmanın ve bunları derleme için kullanmanın birçok yolu vardır. NDK, LLVM'nin yöntemini kullandığından gerçek Java veya Kotlin uygulaması yerine C ya da C++ paylaşılan kitaplıklarınız için en kullanışlı yöntemdir. Clang, her işlev adını (sembol) alır, bunun bir MD5 karmasını oluşturur ve bu ilişkiyi bir eşleme dosyasına çıkarır. Bir işlevin MD5 karması, işlev ilk kez yürütüldüğünde profil dosyasına (profraw biçimi) yazılır. İşlevin sonraki yürütmelerinde, yinelenenleri önlemek için MD5 karma değeri profil dosyasına yazılmaz. Bu nedenle, işlevin yalnızca ilk yürütülmesi siparişe kaydedilir. Profil dosyasını ve eşleme dosyasını inceleyerek her MD5 karmasını alıp karşılık gelen işlevle değiştirebilir ve bir sipariş dosyası elde edebilirsiniz.

Hem onaltılık biçimde bir profil dosyası hem de bir eşleme dosyası örnekleri sırasıyla example.prof ve example-mapping.txt olarak bulunabilir.