สั่งซื้อไฟล์

ไฟล์คำสั่งซื้อเป็นเทคนิคการเพิ่มประสิทธิภาพ Linker ล่าสุด ไฟล์คำสั่งซื้อเหล่านี้คือไฟล์ข้อความที่มีสัญลักษณ์ซึ่งแสดงถึงฟังก์ชัน Linker เช่น lld จะใช้ไฟล์คำสั่งซื้อเพื่อวางเลย์เอาต์ฟังก์ชันในลำดับที่เฉพาะเจาะจง ไบนารีหรือไลบรารีที่มีสัญลักษณ์ที่เรียงลำดับแล้วเหล่านี้จะลดข้อผิดพลาดของหน้าและ ปรับปรุงเวลาเปิดตัวโปรแกรมเนื่องจากการโหลดสัญลักษณ์อย่างมีประสิทธิภาพ ระหว่างการเริ่มต้นโปรแกรมในช่วงเริ่มต้น

คุณสามารถเพิ่มคุณลักษณะของไฟล์คำสั่งซื้อลงในแอปพลิเคชันของคุณได้โดยทำตามขั้นตอนต่อไปนี้ ขั้นตอน:

  1. สร้างโปรไฟล์และไฟล์การแมป
  2. สร้างไฟล์คำสั่งซื้อจากโปรไฟล์และไฟล์การแมป
  3. ใช้ไฟล์คำสั่งซื้อระหว่างบิลด์รุ่นเพื่อวางเลย์เอาต์สัญลักษณ์

สร้างไฟล์คำสั่งซื้อ

การสร้างไฟล์คำสั่งซื้อมี 3 ขั้นตอนดังนี้

  1. สร้างแอปเวอร์ชันที่มีเครื่องดนตรีซึ่งเขียนไฟล์คำสั่งซื้อ
  2. เรียกใช้แอปเพื่อสร้างโปรไฟล์
  3. หลังการประมวลผลโปรไฟล์และไฟล์การแมป

สร้างบิลด์ที่มีเครื่องวัด

โปรไฟล์สร้างขึ้นจากการเรียกใช้บิลด์ที่มีการวัดคุมของแอปพลิเคชัน บิลด์ที่มีเครื่องดนตรีกำหนดให้เพิ่ม -forder-file-instrumentation ลงใน แฟล็กคอมไพเลอร์และ Linker ด้วย วันที่ -mllvm -orderfile-write-mapping=<filename>-mapping.txt ใน Flag คอมไพเลอร์อย่างเข้มงวด แฟล็กการใช้เครื่องมือจะเปิดใช้การติดตั้งใช้งานไฟล์คำสั่งซื้อสำหรับการทำโปรไฟล์และ โหลดไลบรารีเฉพาะที่จำเป็นสำหรับการทำโปรไฟล์ ในทางตรงกันข้าม ธงการแมปจะแสดงไฟล์การแมปที่แสดง แฮช MD5 สำหรับแต่ละฟังก์ชันภายในไบนารีหรือไลบรารี

นอกจากนี้ โปรดตรวจสอบว่าได้ผ่านการตรวจสอบการเพิ่มประสิทธิภาพแล้ว แต่อย่าลืม -O0 เนื่องจาก แฟล็กการใช้เครื่องมือและแฟล็กการแมปต้องมี 1 รายการ หากไม่มีการส่งแฟล็กการเพิ่มประสิทธิภาพ ระบบจะไม่สร้างไฟล์การแมปและ บิลด์ที่มีการวัดคุมอาจแสดงผลแฮชที่ไม่ถูกต้องในไฟล์โปรไฟล์

Ndk-Build

อย่าลืมสร้างด้วย APP_OPTIM=release เพื่อให้ ndk-build ใช้การเพิ่มประสิทธิภาพ โหมดอื่นที่ไม่ใช่ -O0 เมื่อสร้างด้วย AGP การเปิดตัวจะเป็นไปโดยอัตโนมัติ งานสร้าง

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

LOCAL_LDFLAGS += -forder-file-instrumentation

ผู้ผลิต

โปรดตรวจสอบว่าคุณใช้ CMAKE_BUILD_TYPE ที่ไม่ใช่ Debug เพื่อให้ CMake ใช้ โหมดการเพิ่มประสิทธิภาพที่ไม่ใช่ -O0 เมื่อสร้างด้วย AGP โดยอัตโนมัติ สำหรับบิลด์ที่เผยแพร่

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

ระบบบิลด์อื่นๆ

คอมไพล์โค้ดโดยใช้ -forder-file-instrumentation -O1 -mllvm -orderfile-write-mapping=mapping.txt

ไม่จำเป็นต้องระบุ -O1 โดยเฉพาะ แต่อย่าใช้ -O0

ไม่ต้องระบุ -mllvm -orderfile-write-mapping=mapping.txt เมื่อลิงก์

ไม่จำเป็นต้องใช้แฟล็กเหล่านี้สำหรับบิลด์ที่เผยแพร่ ดังนั้นจึงควรควบคุมโดย ตัวแปรบิลด์ เพื่อความง่าย คุณสามารถตั้งค่าทั้งหมดนี้ได้ใน CMakeLists.txt เหมือนใน sample

สร้างไลบรารีไฟล์คำสั่งซื้อ

นอกจากการแจ้งว่าไม่เหมาะสมแล้ว จะต้องมีการตั้งค่าไฟล์โปรไฟล์และ ไบนารีที่มีการวัดต้องทริกเกอร์การเขียนโปรไฟล์อย่างชัดแจ้ง

  • โทร __llvm_profile_set_filename(PROFILE_DIR "/<filename>-%m.profraw") สำหรับ การตั้งค่าเส้นทางโปรไฟล์ แม้ว่าอาร์กิวเมนต์ที่ส่งผ่าน <filename>-%m.profraw ไฟล์โปรไฟล์จะบันทึกเป็น <filename>-%m.profraw.order ตรวจสอบว่าแอปเขียน PROFILE_DIR ได้ และคุณจะมีสิทธิ์เข้าถึงไดเรกทอรีดังกล่าว
    • เนื่องจากมีคลังภาพที่แชร์จำนวนมาก %m จึงมีประโยชน์เนื่องจาก ขยายเป็นลายเซ็นโมดูลที่ไม่ซ้ำกันสำหรับไลบรารี ส่งผลให้ แยกโปรไฟล์ต่อคลังได้ สำหรับตัวระบุรูปแบบเพิ่มเติม คุณสามารถดู ลิงก์นี้
  • โทรหา __llvm_profile_initialize_file() เพื่อตั้งค่าไฟล์โปรไฟล์
  • เรียกใช้ __llvm_orderfile_dump() เพื่อเขียนไปยังไฟล์โปรไฟล์โดยตรง

โปรไฟล์จะถูกรวบรวมไว้ในหน่วยความจำ และฟังก์ชันดัมพ์จะเขียนโปรไฟล์ดังกล่าวลงใน คุณต้องตรวจสอบว่ามีการเรียกใช้ฟังก์ชัน Dump เมื่อเริ่มต้นระบบ ดังนั้นไฟล์โปรไฟล์ของคุณจะมีสัญลักษณ์ทั้งหมดจนกว่าจะสิ้นสุดโปรแกรม

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;
}

เรียกใช้บิลด์สำหรับโปรไฟล์

เรียกใช้แอปที่มีการวัดบนอุปกรณ์จริงหรืออุปกรณ์เสมือนเพื่อสร้าง โปรไฟล์ คุณสามารถแตกไฟล์โปรไฟล์โดยใช้ adb pull

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 .

ดังที่กล่าวไว้ข้างต้น โปรดตรวจสอบว่าโฟลเดอร์มีไฟล์โปรไฟล์ที่เขียนไว้ คุณสามารถเข้าถึงได้ หากเป็นอุปกรณ์เสมือน คุณอาจต้องการหลีกเลี่ยงโปรแกรมจำลองด้วย Play Store เนื่องจากไม่สามารถเข้าถึงโฟลเดอร์จำนวนมาก

กระบวนการหลังการประมวลผลไฟล์โปรไฟล์และการแมป

เมื่อได้รับโปรไฟล์แล้ว คุณจะต้องหาไฟล์การแมปและแปลง แต่ละโปรไฟล์ให้อยู่ในรูปแบบเลขฐาน 16 โดยปกติแล้วคุณจะพบไฟล์การแมปได้ในโฟลเดอร์บิลด์ของแอป หากมีทั้ง 2 แบบแล้ว คุณจะใช้สคริปต์ของเราได้ นำไฟล์โปรไฟล์และไฟล์การแมปที่ถูกต้องไปสร้างไฟล์คำสั่งซื้อ

ระบบปฏิบัติการ 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

ถ้าอยากอ่านเพิ่มเติมเกี่ยวกับสคริปต์ ลองดู README

ใช้ไฟล์คำสั่งซื้อเพื่อสร้างแอปพลิเคชัน

หลังจากสร้างไฟล์คำสั่งซื้อแล้ว คุณควรนำแฟล็กก่อนหน้าและ ฟังก์ชันไฟล์คำสั่งซื้อ เนื่องจากฟังก์ชันดังกล่าวมีไว้สำหรับขั้นตอนการสร้างเท่านั้น คุณเพียงแค่ต้องผ่าน -Wl,--symbol-ordering-file=<filename>.orderfile ไปที่ คอมไพล์และ Linker Flag ในบางครั้ง คุณอาจไม่พบสัญลักษณ์ หรือไม่สามารถย้ายสัญลักษณ์ได้ และจะแสดงคำเตือนเพื่อให้คุณ สามารถส่งผ่าน -Wl,--no-warn-symbol-ordering เพื่อระงับคำเตือนเหล่านี้

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 \

ผู้ผลิต

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
)

ระบบบิลด์อื่นๆ

คอมไพล์โค้ดโดยใช้ -Wl,--symbol-ordering-file=<filename>.orderfile -Wl,--no-warn-symbol-ordering

ดูข้อมูลเพิ่มเติมได้ในตัวอย่างไฟล์คำสั่งซื้อ

รายละเอียดการใช้งานไฟล์คำสั่งซื้อ

การสร้างไฟล์คำสั่งซื้อและนำไปใช้ในการสร้างนั้นมีหลายวิธีด้วยกัน NDK ใช้วิธีการของ LLVM เพื่อให้เป็นประโยชน์มากที่สุดสำหรับ C หรือ C++ ที่คุณแชร์ ทับแอป Java หรือ Kotlin จริง Clang จะใช้ชื่อฟังก์ชัน (สัญลักษณ์) ทั้งหมดและสร้างแฮช MD5 และ จะแสดงผลความสัมพันธ์กับไฟล์การแมป ระบบจะเขียนแฮช MD5 ของฟังก์ชันลงในไฟล์โปรไฟล์ (รูปแบบ profraw) เมื่อ จะดำเนินการเป็นครั้งแรก การดำเนินการของฟังก์ชันในครั้งต่อๆ ไปจะไม่มีการเขียนแฮช MD5 ของฟังก์ชันดังกล่าวลงในไฟล์ เพราะต้องการหลีกเลี่ยงไม่ให้ซ้ำกัน ดังนั้น ระบบจะบันทึกเฉพาะการเรียกใช้ฟังก์ชันครั้งแรกตามลำดับ เมื่อใช้ไฟล์โปรไฟล์และไฟล์การแมป คุณจะสามารถนำแฮช MD5 แต่ละรายการ จากนั้นแทนที่ด้วยฟังก์ชันที่เกี่ยวข้องและรับไฟล์คำสั่งซื้อ

ตัวอย่างของทั้งไฟล์โปรไฟล์ในรูปแบบเลขฐานสิบหกและไฟล์การแมป พบเป็น example.prof และ example-mapping.txt ตามลำดับ