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