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

कॉन्सेप्ट और 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 नतीजे.