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

मेट्रिक, आपके मानदंडों से निकाली गई मुख्य जानकारी होती है. उन्हें 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, और 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 नतीजे.

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 नतीजे.