मैक्रोबेंचमार्क मेट्रिक कैप्चर करें

सिद्धांत और Jetpack Compose को लागू करना

मेट्रिक, आपके मानदंड से निकाली गई मुख्य तरह की जानकारी होती है. इन्हें measureRepeated फ़ंक्शन में List के तौर पर पास किया जाता है. इससे एक साथ कई मेज़र की गई मेट्रिक तय की जा सकती हैं. तुलना करने के लिए, कम से कम एक तरह की मेट्रिक ज़रूरी है.

नीचे दिए गए कोड स्निपेट में, फ़्रेम टाइमिंग और कस्टम ट्रेस सेक्शन की मेट्रिक कैप्चर की गई हैं:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

इस उदाहरण में, RV CreateView और RV OnBindView, ट्रैक किए जा सकने वाले ब्लॉक के आईडी हैं. इन्हें RecyclerView में तय किया गया है. createViewHolder() तरीके के सोर्स कोड से पता चलता है कि अपने कोड में, ट्रैक किए जा सकने वाले ब्लॉक कैसे तय किए जा सकते हैं.

StartupTimingMetric, TraceSectionMetric, और FrameTimingMetric के बारे में इस दस्तावेज़ में आगे बताया गया है. मेट्रिक की पूरी सूची के लिए, Metric की सबक्लास देखें.

बेंचमार्क टेस्ट के नतीजे, Android Studio में दिखाए जाते हैं. जैसा कि पहली इमेज में दिखाया गया है. अगर एक से ज़्यादा मेट्रिक तय की जाती हैं, तो उन सभी को आउटपुट में शामिल किया जाता है.

TraceSectionMetric और FrameTimingMetric के नतीजे.
पहली इमेज. TraceSectionMetric और FrameTimingMetric के नतीजे.

StartupTimingMetric

StartupTimingMetric, ऐप्लिकेशन के शुरू होने में लगने वाले समय की मेट्रिक को इन वैल्यू के साथ कैप्चर करता है:

  • timeToInitialDisplayMs: सिस्टम को लॉन्च करने का अनुरोध मिलने से लेकर, डेस्टिनेशन Activity का पहला फ़्रेम रेंडर होने तक का समय.
  • timeToFullDisplayMs: यह वह समय होता है जब सिस्टम को लॉन्च करने का इंटेंट मिलता है और ऐप्लिकेशन, reportFullyDrawn() तरीके का इस्तेमाल करके पूरी तरह से ड्रॉ होने की रिपोर्ट करता है. reportFullyDrawn() कॉल के बाद या उसमें शामिल होने के बाद, पहले फ़्रेम को रेंडर करने की प्रोसेस पूरी होने पर मेज़रमेंट बंद हो जाता है. ऐसा हो सकता है कि यह मेज़रमेंट, Android 10 (एपीआई लेवल 29) और इससे पहले के वर्शन पर उपलब्ध न हो.

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

StartupTimingMetric के नतीजे
दूसरी इमेज. StartupTimingMetric नतीजे.

FrameTimingMetric

FrameTimingMetric, बेंचमार्क से जनरेट किए गए फ़्रेम से समय की जानकारी कैप्चर करता है. जैसे, स्क्रोलिंग या ऐनिमेशन. साथ ही, यह इन वैल्यू को आउटपुट करता है:

  • frameOverrunMs: इससे पता चलता है कि किसी फ़्रेम को रेंडर करने में कितना समय लगा. पॉज़िटिव नंबर से पता चलता है कि फ़्रेम ड्रॉप हो गया है. साथ ही, इससे दिखने में जैंक या स्टट्रिंग की समस्या होती है. नेगेटिव नंबर से पता चलता है कि सबसिस्टम के हार्डवेयर की समयसीमा के मुकाबले, फ़्रेम कितनी तेज़ी से रेंडर हुआ. ध्यान दें: यह मेट्रिक सिर्फ़ Android 12 (एपीआई लेवल 31) और उसके बाद के वर्शन पर उपलब्ध है.
  • frameDurationCpuMs: यूज़र इंटरफ़ेस (यूआई) थ्रेड और RenderThread, दोनों पर सीपीयू में फ़्रेम को रेंडर होने में लगने वाला समय.

इन मेज़रमेंट को 50वें, 90वें, 95वें, और 99वें पर्सेंटाइल के डिस्ट्रिब्यूशन में इकट्ठा किया जाता है.

रेंडर होने में ज़्यादा समय लेने वाले फ़्रेम की पहचान करने और उन्हें बेहतर बनाने के तरीके के बारे में ज़्यादा जानने के लिए, रेंडर होने में ज़्यादा समय लेना लेख पढ़ें.

FrameTimingMetric के नतीजे
तीसरी इमेज. FrameTimingMetric नतीजे.

TraceSectionMetric

TraceSectionMetric, किसी खास ट्रेस सेक्शन के होने की संख्या और उसे पूरा होने में लगने वाले समय को कैप्चर करता है. समय ट्रैक करने के लिए, यह मिलीसेकंड में कम से कम, औसत, और ज़्यादा से ज़्यादा समय दिखाता है.

टारगेट ट्रेस सेक्शन को फ़ंक्शन कॉल trace(sectionName) या Trace.beginSection(sectionName) और Trace.endSection() के बीच की लोअर-लेवल ब्लॉक सीमाओं या उनके एसिंक वैरिएंट से तय किया जाता है. यह हमेशा मेज़रमेंट के दौरान कैप्चर किए गए ट्रेस सेक्शन के पहले इंस्टेंस को चुनता है. यह डिफ़ॉल्ट रूप से, आपके पैकेज से सिर्फ़ ट्रेस सेक्शन आउटपुट करता है. अपने पैकेज से बाहर की प्रोसेस को शामिल करने के लिए, targetPackageOnly = false सेट करें.

ट्रेसिंग के बारे में ज़्यादा जानने के लिए, सिस्टम ट्रेसिंग की खास जानकारी और कस्टम इवेंट तय करना लेख पढ़ें.

TraceSectionMetric
चौथी इमेज. TraceSectionMetric नतीजे.