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

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

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

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, और PowerMetric के बारे में इस दस्तावेज़ में आगे बताया गया है.

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

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

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

PowerMetric

PowerMetric, आपके टेस्ट की अवधि के दौरान, दी गई पावर कैटगरी के लिए, पावर या ऊर्जा में हुए बदलाव को कैप्चर करता है. चुनी गई हर कैटगरी को मेज़र किए जा सकने वाले सब-कॉम्पोनेंट में बांटा जाता है. साथ ही, चुने नहीं गए कैटगरी को "चुने नहीं गए" मेट्रिक में जोड़ा जाता है.

ये मेट्रिक, पूरे सिस्टम में होने वाले डेटा खर्च को मेज़र करती हैं, न कि हर ऐप्लिकेशन के हिसाब से. ये मेट्रिक, Pixel 6, Pixel 6 Pro, और उसके बाद के वर्शन वाले डिवाइसों पर ही काम करती हैं:

  • power<category>Uw: इस कैटगरी में, जांच के दौरान खर्च की गई बिजली की मात्रा.
  • energy<category>Uws: इस कैटगरी में, जांच के दौरान हर समय इकाई के हिसाब से ट्रांसफ़र की गई ऊर्जा की मात्रा.

कैटगरी में ये शामिल हैं:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

CPU जैसी कुछ कैटगरी में, अन्य प्रोसेस से किए गए काम को अपने ऐप्लिकेशन से किए गए काम से अलग करना मुश्किल हो सकता है. रुकावट को कम करने के लिए, ज़रूरत के मुताबिक ऐप्लिकेशन और खातों को हटाएं या उन पर पाबंदी लगाएं.

PowerMetric के नतीजे
पांचवीं इमेज. PowerMetric नतीजे.