Macrobenchmark মেট্রিক ক্যাপচার করা

আপনার বেঞ্চমার্ক থেকে এক্সট্র্যাক্ট করা তথ্যের প্রধান ধরন হল মেট্রিক। এগুলি List হিসেবে measureRepeated ফাংশনে পাস করা হয়, যা আপনাকে একসাথে একাধিক পরিমাপ করা মেট্রিক নির্দিষ্ট করতে দেয়। বেঞ্চমার্ক চালানোর জন্য অন্তত এক ধরনের মেট্রিক প্রয়োজন।

নিম্নলিখিত কোড স্নিপেট, Jetpack Compose লেজি লেআউট ইন্টারফেসের জন্য ফ্রেম টাইমিং এবং কাস্টম ট্রেস বিভাগ মেট্রিক ক্যাপচার করে:

@OptIn(ExperimentalMetricApi::class)
    @Test
    fun scrollComposeList() {
        benchmarkRule.measureRepeated(
            // [START_EXCLUDE]
            packageName = TARGET_PACKAGE,
            metrics = listOf(
                FrameTimingMetric(),
                // Measure power usage. This is supported on Pixel 6 and later.
                PowerMetric(PowerMetric.Type.Power(
                    mapOf(
                        PowerCategory.CPU to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.DISPLAY to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.GPU to PowerCategoryDisplayLevel.TOTAL,
                        PowerCategory.NETWORK to PowerCategoryDisplayLevel.TOTAL,
                    )
                )),
                // Measure custom trace sections by name EntryRow (which is added to the EntryRow composable).
                // Mode.Sum measures combined duration and also how many times it occurred in the trace.
                // This way, you can estimate whether a composable recomposes more than it should.
                TraceSectionMetric("EntryRowCustomTrace", TraceSectionMetric.Mode.Sum),
                // This trace section takes into account the SQL wildcard character %,
                // which can find trace sections without the full name.
                // This way, you can measure composables produced by the composition tracing
                // and measure how long they took and how many times they recomposed.
                // WARNING: This metric only shows results when running with composition tracing, otherwise it won't be visible in the outputs.
                TraceSectionMetric("%EntryRow%", TraceSectionMetric.Mode.Sum),
            ),
            // Try switching to different compilation modes to see the effect
            // it has on frame timing metrics.
            compilationMode = CompilationMode.None(),
            startupMode = StartupMode.WARM, // restarts activity each iteration
            iterations = DEFAULT_ITERATIONS,
            // [END_EXCLUDE]
            setupBlock = {
                uiAutomator {
                    // Before starting to measure, navigate to the UI to be measured.
                    startIntent(Intent("$packageName.COMPOSE_ACTIVITY"))
                }
            }
        ) {
            uiAutomator {
                onElement { isScrollable }.fling(Direction.DOWN)
            }
        }
    }

নিম্নলিখিত উদাহরণে, EntryRowCustomTrace স্ট্যান্ডার্ড Kotlin trace(sectionName) { ... } ব্লক র‍্যাপার ব্যবহার করে কম্পোজেবল আইটেম লেয়ারের মধ্যে সংজ্ঞায়িত একটি কাস্টম ট্রেস বিভাগকে উপস্থাপন করে। TraceSectionMetric-এর জন্য ডেটা প্রদান করতে, আপনাকে অবশ্যই স্ট্যান্ডার্ড Jetpack রানটাইম trace ব্লক র‍্যাপার সহ আপনার অ্যাপ্লিকেশনের প্রোডাকশন কোডবেসের মধ্যে টার্গেট UI কম্পোনেন্ট র‍্যাপ করতে হবে:

@Composable
private fun EntryRow(entry: Entry, modifier: Modifier = Modifier) = trace("EntryRowCustomTrace") {
    Card(modifier = modifier) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Text(
                text = entry.contents,
                modifier = Modifier
                    .padding(16.dp)
                    .wrapContentSize()
            )

            Spacer(modifier = Modifier.weight(1f))

            Checkbox(
                checked = false,
                onCheckedChange = {},
                modifier = Modifier.padding(16.dp)
            )
        }
    }
}

বেঞ্চমার্কের ফলাফল সরাসরি Android Studio-র মধ্যে বেঞ্চমার্ক টার্মিনাল ট্যাবে আউটপুট হিসেবে দেখানো হয়, যেমনটি চিত্র ১-এ দেখানো হয়েছে। একাধিক মেট্রিক সংজ্ঞায়িত করা হলে, তাদের সব গণনা করা ডেটা পয়েন্ট সারসংক্ষেপ উইন্ডোতে একত্রিত করা হয়।

TraceSectionMetric এবং FrameTimingMetric-এর ফলাফল।
ছবি ১. আধুনিক Compose লেআউটের জন্য TraceSectionMetric ও FrameTimingMetric-এর সম্মিলিত কনসোল ফলাফল।

StartupTimingMetric, FrameTimingMetric, TraceSectionMetric এবং PowerMetric সম্পর্কে নিচে বিস্তারিতভাবে আলোচনা করা হয়েছে। উপলভ্য বেঞ্চমার্ক মেট্রিকের সম্পূর্ণ তালিকার জন্য, API রেফারেন্সে Metric-এর সাবক্লাস দেখুন।

StartupTimingMetric

StartupTimingMetric নিম্নলিখিত ভ্যালু সহ অ্যাপ স্টার্টআপ টাইমিং মেট্রিক ক্যাপচার করে:

  • timeToInitialDisplayMs: সিস্টেম লঞ্চ ইনটেন্ট পাওয়ার পর থেকে ডেস্টিনেশন স্ক্রিনের প্রথম ফ্রেম রেন্ডার করা পর্যন্ত সময়।
  • timeToFullDisplayMs: সিস্টেম লঞ্চ ইনটেন্ট পাওয়ার পর থেকে ইন্টার্নাল প্ল্যাটফর্ম রিপোর্টিং মেকানিজম ব্যবহার করে অ্যাপ সম্পূর্ণভাবে ড্র করার রিপোর্ট করা পর্যন্ত সময়। সম্পূর্ণ আঁকা সিগন্যাল সহ বা তার পরে প্রথম ফ্রেম রেন্ডার করা সম্পূর্ণ হলে পরিমাপ করা বন্ধ হয়ে যায়।

StartupTimingMetric স্টার্টআপ ইটারেশন থেকে ন্যূনতম, মধ্যক ও সর্বাধিক ভ্যালু আউটপুট করে। স্টার্ট-আপের উন্নতি মূল্যায়ন করতে, সর্বদা মিডিয়ান ভ্যালুর উপর ফোকাস করুন, কারণ তারা সাধারণ ব্যবহারকারীর স্টার্ট-আপ সময়ের সেরা অনুমান প্রদান করে।

Compose-ফার্স্ট আর্কিটেকচারে, ম্যানুয়ালি activity.reportFullyDrawn ইনভোক করার চেষ্টা করবেন না। পরিবর্তে, আপনার স্ক্রিন কম্পোজেবলের মধ্যে কম্পোজ-সেফ অ্যাসিঙ্ক্রোনাস ইউটিলিটি ReportDrawn, ReportDrawnWhen বা ReportDrawnAfter ব্যবহার করুন যাতে আপনার অ্যাসিঙ্ক নেটওয়ার্ক ডেটা বা জটিল UI স্টেট রেন্ডারিং শেষ হলে Macrobenchmark-এ অটোমেটিক সিগন্যাল পাঠানো যায়।

ইনিশিয়ালাইজেশন পারফর্ম্যান্স বিশ্লেষণ ও অপ্টিমাইজ করার ব্যাপারে আরও তথ্যের জন্য, অ্যাপ স্টার্টআপ টাইম দেখুন।

FrameTimingMetric

FrameTimingMetric বেঞ্চমার্ক জার্নি থেকে তৈরি হওয়া ফ্রেম থেকে সুনির্দিষ্ট টাইমিং সংক্রান্ত তথ্য ক্যাপচার করে, যেমন কোনও তালিকা বা জটিল UI লেআউট অ্যানিমেশন স্ক্রল করা এবং নিম্নলিখিত ডায়াগনস্টিক ভ্যালু আউটপুট হিসেবে দেখায়:

  • frameOverrunMs: কোনও ফ্রেম তার ডেডলাইন মিস করার সময়সীমা। পজিটিভ নম্বর থেকে বোঝা যায় যে ফ্রেম ড্রপ হয়েছে এবং তার সাথে দৃশ্যমান জ্যাঙ্ক বা স্টাটার হয়েছে। সাবসিস্টেম হার্ডওয়্যার ডেডলাইনের তুলনায় কত দ্রুত একটি ফ্রেম সম্পূর্ণ হয়েছে তা নেগেটিভ সংখ্যা থেকে বোঝা যায়। মনে রাখবেন: এই মেট্রিক শুধুমাত্র Android 12 (API লেভেল 31) ও তার পরবর্তী যেকোনও ভার্সনে উপলভ্য।
  • frameDurationCpuMs: প্রধান অ্যাপ্লিকেশন UI থ্রেড এবং Compose RenderThread, উভয় ক্ষেত্রেই CPU-তে ফ্রেম তৈরি করার জন্য যতটা সময় লেগেছে।

এইসব পরিমাপ ৫০তম, ৯০তম, ৯৫তম ও ৯৯তম পার্সেন্টাইলের ডিস্ট্রিবিউশনে সংগ্রহ করা হয়:

frameDurationCpuMs P50 3.5, P90 6.0, P95 6.4, P99 11.0
frameOverrunMs P50 -11.6, P90 -7.2, P95 -7.1, P99 -1.2

Jetpack Compose লেআউট হায়ারার্কি অপ্টিমাইজ করার সময়, আপনার সবচেয়ে খারাপ পারফর্ম করা ফ্রেমগুলি (P95 এবং P99 বাউন্ড) দেখুন। যদি frameOverrunMs উচ্চ পার্সেন্টাইলে ধনাত্মক পূর্ণসংখ্যায় স্পাইক করে, তাহলে এটি ইঙ্গিত করে যে রিকম্পোজিশন ভারী স্ক্রোল অ্যানিমেশনের সময় প্রধান থ্রেডকে স্টল করছে।

স্লো ফ্রেম শনাক্ত করা ও সমাধান করার ব্যাপারে আরও গভীর ইনসাইটের জন্য, Jetpack Compose পারফর্ম্যান্স দেখুন।

TraceSectionMetric

TraceSectionMetric নির্দিষ্ট ট্রেস সেকশন কতবার ঘটে এবং এটি এক্সিকিউট করতে কত সময় লাগে তা ক্যাপচার করে। সময় ট্র্যাক করার জন্য, এটি মিলিসেকেন্ডে ন্যূনতম, মধ্যক এবং সর্বাধিক সময় আউটপুট করে। টার্গেট ট্রেস বিভাগটি হয় trace(sectionName) ফাংশন কল অথবা Trace.beginSection(sectionName) এবং Trace.endSection()-এর মধ্যে লোয়ার-লেভেল ব্লক বাউন্ডারি অথবা তাদের অ্যাসিঙ্ক ভেরিয়েন্ট দ্বারা সংজ্ঞায়িত করা হয়।

EntryRowCustomTraceCount min 20.0, median 28.0, max 50.0
EntryRowCustomTraceSumMs min 34.9, median 44.4, max 66.6

ডিফল্ট হিসেবে, মেট্রিকটি শুধুমাত্র আপনার নিজস্ব অ্যাপ্লিকেশন প্যাকেজ বাইনারি থেকে সরাসরি কম্পাইল করা ট্রেস সেকশন আউটপুট করে। আপনার অ্যাপের প্যাকেজ সীমানার বাইরে থেকে শুরু হওয়া প্রসেস অন্তর্ভুক্ত করতে, targetPackageOnly = false প্রপার্টি সেট করুন।

Jetpack Compose রানটাইম ট্রেসিং নিয়ে কাজ করার সময়, আপনি কম্পোজিশন ট্রেসিং চালু করে, ম্যানুয়াল ট্রেস র‍্যাপার না লিখেই, আপনার সিস্টেম ট্রেস গ্রাফে স্বতন্ত্র কম্পোজেবল ফাংশন সারফেস করতে পারবেন।

ম্যানুয়াল প্রোফাইলার ট্রেসের জন্য আপনার টার্গেট অ্যাপ্লিকেশনে androidx.compose.runtime:runtime-tracing ডিপেন্ডেন্সি যোগ করাই যথেষ্ট হলেও, Macrobenchmark রান করার সময় প্রোগ্রাম্যাটিক্যালি এইসব ট্রেস ক্যাপচার করার জন্য আপনার বেঞ্চমার্ক মডিউলে অতিরিক্ত কনফিগারেশন প্রয়োজন।

সেট-আপ সংক্রান্ত সম্পূর্ণ নির্দেশাবলীর জন্য, Jetpack Macrobenchmark-এর সাহায্যে ট্রেস ক্যাপচার করুন দেখুন।

PowerMetric

PowerMetric আপনার Macrobenchmark রান করার সময়সীমা জুড়ে পাওয়ার বা এনার্জির পরিবর্তন ক্যাপচার করে। বেছে নেওয়া প্রতিটি বিভাগকে তার পরিমাপযোগ্য হার্ডওয়্যার কম্পোনেন্টে ভাগ করা হয়, অন্যদিকে বেছে না নেওয়া বিভাগগুলিকে "বেছে না নেওয়া" বাকেটে গ্রুপ করা হয়।

হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা: এই মেট্রিকগুলি অ্যাপ-প্রতি হিসেব করার পরিবর্তে সিস্টেম-ব্যাপী খরচ পরিমাপ করে। এর ফলে, ডেটা সংগ্রহ শুধুমাত্র ফিজিক্যাল Google Pixel 6, Pixel 6 Pro এবং আরও নতুন ফিজিক্যাল ডিভাইসের মধ্যেই সীমাবদ্ধ।

মেট্রিকটি প্রতিটি বিভাগের জন্য দুটি পরিমাপ আউটপুট করে:

  • power<category>Uw: এই বিভাগে আপনার টেস্ট চলাকালীন ব্যবহৃত পাওয়ারের পরিমাণ (মাইক্রোওয়াটে পরিমাপ করা হয়)।
  • energy<category>Uws: এই বিভাগে আপনার টেস্টের সময়কালের জন্য প্রতি ইউনিট সময়ে স্থানান্তরিত মোট শক্তির পরিমাণ (মাইক্রোওয়াট-সেকেন্ডে পরিমাপ করা হয়)।

বিভাগের মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:

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

CPU-এর মতো কিছু বিভাগের ক্ষেত্রে, আপনার নিজের অ্যাপের মাধ্যমে করা কাজ থেকে অন্যান্য প্রসেসের মাধ্যমে করা কাজ আলাদা করা কঠিন হতে পারে। হস্তক্ষেপ কমাতে, অপ্রয়োজনীয় অ্যাপ এবং অ্যাকাউন্ট সরান বা সীমাবদ্ধ করুন।

powerCategoryCpuUw min 300.2, median 346.1, max 519.6
powerCategoryDisplayUw min 319.8, median 325.8, max 329.7
powerCategoryGpuUw min 18.8, median 23.3, max 36.9
powerCategoryNetworkUw min 97.3, median 123.3, max 681.3
powerTotalUw min 1234.8, median 1316.6, max 2112.4
powerUnselectedUw       min  483.3,  median  512.6,  max  561.7

প্রধান সাবসিস্টেম বিশ্লেষণ করা হচ্ছে

PowerMetric আপনার পরীক্ষার সময়কালে প্রদত্ত পাওয়ার ক্যাটেগরির জন্য পাওয়ার বা এনার্জির পরিবর্তন ক্যাপচার করে। আপনার বেছে নেওয়া প্রতিটি বিভাগকে তার পরিমাপযোগ্য সাবকম্পোনেন্টে ভাগ করা হয় এবং বেছে না নেওয়া বিভাগগুলিকে "বেছে না নেওয়া" মেট্রিকের সাথে যোগ করা হয়।

আপনার অনুরোধ করা কনফিগারেশনে টার্মিনাল আউটপুট ম্যাপ:

  • powerCategoryCpuUw: আপনার টেস্টের সময়সীমা জুড়ে CPU-এর দ্বারা ব্যবহৃত পাওয়ারের পরিমাণ।
  • powerCategoryGpuUw: আপনার টেস্টের সময়সীমা জুড়ে GPU-এর মাধ্যমে খরচ হওয়া বিদ্যুতের পরিমাণ।
  • powerUnselectedUw: আপনার ইনিশিয়ালাইজেশন ম্যাপে স্পষ্টভাবে অনুরোধ করা হয়নি এমন সব উপলভ্য হার্ডওয়্যার ক্যাটেগরি দ্বারা ব্যবহৃত মোট পাওয়ার।

রান করার সময় হার্ডওয়্যার রেলে ডেটার অনিয়মিত স্পাইক প্রতিরোধ করতে, স্ক্রিনের উজ্জ্বলতা একটি নির্দিষ্ট মানে লক করুন, ডিভাইসের তাপমাত্রা স্থিতিশীল রাখুন এবং Macrobenchmark লুপ শুরু করার আগে ব্যাকগ্রাউন্ডে চলা অন্যান্য প্রসেস বন্ধ করুন।

অতিরিক্ত রিসোর্স

কন্টেন্ট দেখে