फ़ाइलें ऑर्डर करें

ऑर्डर फ़ाइल, लिंक की गई हाल ही की ऑप्टिमाइज़ेशन तकनीक है. ऑर्डर वाली ये फ़ाइलें, ऐसी टेक्स्ट फ़ाइलें होती हैं जिनमें फ़ंक्शन दिखाने वाले सिंबल मौजूद होते हैं. lld जैसे लिंकर किसी खास क्रम में लेआउट फ़ंक्शन के लिए, ऑर्डर फ़ाइलों का इस्तेमाल करते हैं. क्रम से लगाए गए सिंबल वाली ये बाइनरी या लाइब्रेरी, पेज में मौजूद गड़बड़ियों को कम करती हैं और सिंबल की अच्छी तरह लोड होने की वजह से प्रोग्राम के लॉन्च होने के समय को कम कर सकता है शुरुआती दौर में होने वाले खर्चे के हिसाब से.

ऑर्डर फ़ाइल की सुविधाओं को ऐप्लिकेशन में जोड़ा जा सकता है. इसके लिए, आपको इन तीन सुविधाओं का इस्तेमाल करना होगा चरण:

  1. प्रोफ़ाइल और मैपिंग फ़ाइल जनरेट करें
  2. प्रोफ़ाइल और मैपिंग फ़ाइल से ऑर्डर फ़ाइल बनाएं
  3. रिलीज़ के दौरान सिंबल का लेआउट तय करने के लिए, रिलीज़ के दौरान ऑर्डर फ़ाइल का इस्तेमाल करें

आदेश फ़ाइल जनरेट करें

आदेश फ़ाइल बनाने के लिए तीन चरणों की आवश्यकता होती है:

  1. ऐप्लिकेशन का एक इंस्ट्रुमेंट्ड वर्शन बनाएं, जो ऑर्डर फ़ाइल लिखता है
  2. प्रोफ़ाइल जनरेट करने के लिए ऐप्लिकेशन चलाएं
  3. प्रोफ़ाइल और मैपिंग फ़ाइल को प्रोसेस करने के बाद

इंस्ट्रुमेंटेड बिल्ड बनाएं

ऐप्लिकेशन के इंस्ट्रुमेंट्ड बिल्ड को चलाकर प्रोफ़ाइल जनरेट की जाती हैं. इंस्ट्रुमेंट्ड बिल्ड के लिए दोनों में -forder-file-instrumentation जोड़ना ज़रूरी है इसके साथ कंपाइलर और लिंकर फ़्लैग -mllvm -orderfile-write-mapping=<filename>-mapping.txt कंपाइलर फ़्लैग में सख्ती से जोड़ा जा रहा है. इंस्ट्रुमेंटेशन फ़्लैग प्रोफ़ाइलिंग के लिए ऑर्डर फ़ाइल इंस्ट्रुमेंटेशन को चालू करता है और प्रोफ़ाइल बनाने के लिए ज़रूरी खास लाइब्रेरी लोड करता है. दूसरी ओर, मैपिंग फ़्लैग सिर्फ़ उस मैपिंग फ़ाइल को आउटपुट के रूप में दिखाता है, जो बाइनरी या लाइब्रेरी में मौजूद हर फ़ंक्शन के लिए MD5 हैश.

इसके अलावा, किसी भी ऑप्टिमाइज़ेशन फ़्लैग को पास करना न भूलें, लेकिन -O0 क्योंकि दोनों इंस्ट्रुमेंटेशन फ़्लैग और मैपिंग फ़्लैग के लिए एक की ज़रूरत होती है. अगर कोई ऑप्टिमाइज़ेशन फ़्लैग पास नहीं किया जाता है, तो मैपिंग फ़ाइल जनरेट नहीं होती है और इंस्ट्रुमेंट्ड बिल्ड, प्रोफ़ाइल फ़ाइल पर गलत हैश का आउटपुट दे सकता है.

एनडीके-बिल्ड

पक्का करें कि बिल्ड APP_OPTIM=release का इस्तेमाल किया जा रहा हो, ताकि ndk-build, ऑप्टिमाइज़ेशन का इस्तेमाल कर सके -O0 के अलावा कोई दूसरा मोड. AGP के साथ तैयार करते समय, यह अपने-आप रिलीज़ हो जाता है बिल्ड.

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

LOCAL_LDFLAGS += -forder-file-instrumentation

सीमेक

Debug के बजाय, CMAKE_BUILD_TYPE का इस्तेमाल करें, ताकि CMaker -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 में सेट अप कर सकते हैं, जैसा कि हमारी सैंपल.

ऑर्डर फ़ाइल लाइब्रेरी बनाना

फ़्लैग के अलावा, प्रोफ़ाइल फ़ाइल को सेट अप करना होगा और इंस्ट्रुमेंटेड बाइनरी को प्रोफ़ाइल लेखन को ट्रिगर करने के लिए लागू करता है.

  • इसके लिए __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() पर कॉल करें

प्रोफ़ाइल, मेमोरी में इकट्ठा की जाती हैं और डंप फ़ंक्शन उन्हें फ़ाइल से लिए जाते हैं. आपको यह पक्का करना होगा कि स्टार्टअप के आखिर में डंप फ़ंक्शन को कॉल किया गया हो ताकि आपकी प्रोफ़ाइल फ़ाइल में ब्राउज़र के शुरू होने तक सभी सिंबल मौजूद रहें.

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

Build for Profiles चलाएं

इंस्ट्रुमेंट वाले ऐप्लिकेशन को किसी फ़िज़िकल या वर्चुअल डिवाइस पर चलाएं प्रोफ़ाइल. 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 पर एम्युलेटर का इस्तेमाल करने से बचना चाहिए ऐसा इसलिए, क्योंकि आपके पास कई फ़ोल्डर का ऐक्सेस नहीं है.

प्रोफ़ाइल और मैपिंग फ़ाइल को पोस्टप्रोसेस

प्रोफ़ाइल मिलने पर, आपको मैपिंग फ़ाइल ढूंढनी होगी और उसे बदलना होगा हेक्साडेसिमल फ़ॉर्मैट में हर प्रोफ़ाइल. आम तौर पर, मैपिंग फ़ाइल को ऐप्लिकेशन के बिल्ड फ़ोल्डर में ढूंढा जा सकता है. अगर आपके पास दोनों हैं, तो हमारी स्क्रिप्ट का इस्तेमाल करें ऑर्डर फ़ाइल जनरेट करने के लिए, प्रोफ़ाइल फ़ाइल और सही मैपिंग फ़ाइल लें.

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

विंडो

certutil -f -encodeHex default-%m.profraw.order default-%m.prof
python3 create_orderfile.py --profile-file default-%m.prof --mapping-file <filename>-mapping.txt

अगर आपको स्क्रिप्ट के बारे में और पढ़ना है, तो रीडमी.

ऐप्लिकेशन बनाने के लिए ऑर्डर फ़ाइल का इस्तेमाल करना

ऑर्डर फ़ाइल जनरेट करने के बाद, आपको पुराने फ़्लैग हटा देने चाहिए और ऑर्डर फ़ाइल फ़ंक्शन का इस्तेमाल करना चाहिए क्योंकि वे सिर्फ़ जनरेशन चरणों के लिए होते हैं. आपको बस -Wl,--symbol-ordering-file=<filename>.orderfile को कंपाइल और लिंकर फ़्लैग. कभी-कभी, सिंबल नहीं मिल पाते या उन्हें अपनी जगह से दूसरी जगह नहीं ले जाया जा सकता और वे चेतावनियां भी देते हैं, ताकि आप इन चेतावनियों को रोकने के लिए, -Wl,--no-warn-symbol-ordering को पास कर सकता है.

एनडीके-बिल्ड

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++ शेयर किए गए C++ के लिए सबसे काम का होता है लाइब्रेरी के साथ काम करता है. Clang, हर फ़ंक्शन का नाम (सिंबल) लेता है और उसका एक MD5 हैश बनाता है और यह एक मैपिंग फ़ाइल से संबंधित होता है. किसी फ़ंक्शन के MD5 हैश को प्रोफ़ाइल फ़ाइल (प्रोफ़्रॉ फ़ॉर्मैट) में तब लिखा जाता है, जब पहली बार काम करता है. फ़ंक्शन को एक्ज़ीक्यूट करने पर इसका MD5 हैश प्रोफ़ाइल फ़ाइल डाउनलोड कर सकता है, क्योंकि यह डुप्लीकेट से बचना चाहता है. इस वजह से, फ़ंक्शन का सिर्फ़ पहला एक्ज़ीक्यूशन ऑर्डर में रिकॉर्ड किया जाता है. प्रोफ़ाइल फ़ाइल और मैपिंग फ़ाइल की मदद से, हर MD5 हैश को लिया जा सकता है और इसे संबंधित फ़ंक्शन से बदलें और एक ऑर्डर फ़ाइल पाएं.

हेक्साडेसिमल फ़ॉर्मैट में प्रोफ़ाइल फ़ाइल और मैपिंग फ़ाइल, दोनों के उदाहरण ये हो सकते हैं example.prof के तौर पर मिला और example-mapping.txt.