মেট্রিক হলো আপনার বেঞ্চমার্ক থেকে সংগৃহীত তথ্যের প্রধান ধরন। এগুলোকে একটি 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 হলো একটি কাস্টম ট্রেস সেকশন যা কম্পোজেবল আইটেম লেয়ারের ভিতরে স্ট্যান্ডার্ড কোটলিন trace(sectionName) { ... } ব্লক র্যাপার ব্যবহার করে সংজ্ঞায়িত করা হয়েছে। TraceSectionMetric জন্য ডেটা সরবরাহ করতে, আপনাকে অবশ্যই আপনার অ্যাপ্লিকেশনের প্রোডাকশন কোডবেসের ভিতরে টার্গেট UI কম্পোনেন্টগুলিকে স্ট্যান্ডার্ড জেটপ্যাক রানটাইম trace ব্লক র্যাপার দিয়ে র্যাপ করতে হবে:
@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)
)
}
}
}
চিত্র ১-এ দেখানো অনুযায়ী, বেঞ্চমার্কের ফলাফল সরাসরি অ্যান্ড্রয়েড স্টুডিও-র ভেতরের বেঞ্চমার্ক টার্মিনাল ট্যাবে আউটপুট হয়। যদি একাধিক মেট্রিক সংজ্ঞায়িত করা থাকে, তবে সেগুলোর গণনাকৃত সমস্ত ডেটা পয়েন্ট সামারি উইন্ডোতে একত্রিত করা হয়।

TraceSectionMetric এবং FrameTimingMetric এর সম্মিলিত কনসোল ফলাফল। StartupTimingMetric , FrameTimingMetric , TraceSectionMetric এবং PowerMetric সম্পর্কে নিচে বিস্তারিত আলোচনা করা হয়েছে। উপলব্ধ বেঞ্চমার্ক মেট্রিকগুলোর সম্পূর্ণ তালিকার জন্য, এপিআই রেফারেন্সে Metric এর সাবক্লাসগুলো দেখুন।
স্টার্টআপটাইমিংমেট্রিক
StartupTimingMetric নিম্নলিখিত মানগুলির মাধ্যমে অ্যাপ চালু হওয়ার সময়ের মেট্রিকগুলি সংগ্রহ করে:
-
timeToInitialDisplayMs: সিস্টেম একটি লঞ্চ ইন্টেন্ট গ্রহণ করার মুহূর্ত থেকে গন্তব্য স্ক্রিনের প্রথম ফ্রেমটি রেন্ডার করার মুহূর্ত পর্যন্ত সময়কাল। -
timeToFullDisplayMs: সিস্টেম একটি লঞ্চ ইন্টেন্ট গ্রহণ করার মুহূর্ত থেকে প্ল্যাটফর্মের অভ্যন্তরীণ রিপোর্টিং প্রক্রিয়া ব্যবহার করে অ্যাপটি সম্পূর্ণভাবে অঙ্কিত (fully drawn) হিসেবে রিপোর্ট করার মধ্যবর্তী সময়কাল। সম্পূর্ণভাবে অঙ্কিত সংকেতের পরবর্তী বা সেই সংকেত ধারণকারী প্রথম ফ্রেমটির রেন্ডারিং সম্পন্ন হলে এই পরিমাপ বন্ধ হয়ে যায়।
StartupTimingMetric স্টার্টআপ ইটারেশনগুলো থেকে সর্বনিম্ন, মধ্যক এবং সর্বোচ্চ মান আউটপুট করে। স্টার্টআপের উন্নতি মূল্যায়ন করতে, সর্বদা মধ্যক মানগুলোর উপর মনোযোগ দিন, কারণ এগুলো একজন সাধারণ ব্যবহারকারীর স্টার্টআপের সাধারণ সময়ের সবচেয়ে ভালো ধারণা দেয়।
কম্পোজ-ফার্স্ট আর্কিটেকচারে, activity.reportFullyDrawn ম্যানুয়ালি কল করার চেষ্টা করবেন না। এর পরিবর্তে, আপনার স্ক্রিন কম্পোজেবলগুলোর ভেতরে কম্পোজ-সেফ অ্যাসিঙ্ক্রোনাস ইউটিলিটি ReportDrawn , ReportDrawnWhen , বা ReportDrawnAfter ব্যবহার করুন, যাতে আপনার অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক ডেটা বা জটিল UI স্টেটগুলোর রেন্ডারিং শেষ হলে ম্যাক্রোবেঞ্চমার্ককে স্বয়ংক্রিয়ভাবে সংকেত দেওয়া যায়।
ইনিশিয়ালাইজেশন পারফরম্যান্স বিশ্লেষণ ও অপ্টিমাইজ করার বিষয়ে আরও তথ্যের জন্য, অ্যাপ স্টার্টআপ টাইম দেখুন।
ফ্রেমটাইমিংমেট্রিক
FrameTimingMetric একটি বেঞ্চমার্ক যাত্রার (যেমন একটি তালিকা স্ক্রোল করা বা একটি জটিল UI লেআউট অ্যানিমেশন) মাধ্যমে উৎপাদিত ফ্রেমগুলি থেকে সুনির্দিষ্ট টাইমিং তথ্য সংগ্রহ করে এবং নিম্নলিখিত ডায়াগনস্টিক মানগুলি আউটপুট করে:
-
frameOverrunMs: একটি নির্দিষ্ট ফ্রেম তার ডেডলাইন অতিক্রম করতে যে পরিমাণ সময় নেয়, তার পরিমাণ। ধনাত্মক সংখ্যা একটি ড্রপ হওয়া ফ্রেমকে নির্দেশ করে, যার সাথে দৃশ্যমান জ্যাঙ্ক বা স্টাটার দেখা যায়। ঋণাত্মক সংখ্যা নির্দেশ করে যে সাবসিস্টেম হার্ডওয়্যারের ডেডলাইনের তুলনায় একটি ফ্রেম কত দ্রুত সম্পন্ন হয়েছে। দ্রষ্টব্য: এই মেট্রিকটি শুধুমাত্র অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং এর পরবর্তী সংস্করণগুলোতে উপলব্ধ। -
frameDurationCpuMs: মূল অ্যাপ্লিকেশন UI থ্রেড এবং ComposeRenderThreadউভয় মিলিয়ে, ফ্রেমটি সিপিইউ-তে সক্রিয়ভাবে তৈরি হতে যে পরিমাণ সময় ব্যয় করে।
এই পরিমাপগুলো ৫০তম, ৯০তম, ৯৫তম এবং ৯৯তম পার্সেন্টাইলের বিন্যাসে সংগ্রহ করা হয়:
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 Performance দেখুন।
ট্রেসসেকশনমেট্রিক
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 Runtime Tracing নিয়ে কাজ করার সময়, কম্পোজিশন ট্রেসিং সক্রিয় করার মাধ্যমে আপনি ম্যানুয়াল ট্রেস র্যাপার না লিখেই আপনার সিস্টেম ট্রেস গ্রাফে স্বতন্ত্র কম্পোজেবল ফাংশনগুলোকে তুলে ধরতে পারেন।
ম্যানুয়াল প্রোফাইলার ট্রেসের জন্য আপনার টার্গেট অ্যাপ্লিকেশনে androidx.compose.runtime:runtime-tracing ডিপেন্ডেন্সিটি যোগ করাই যথেষ্ট হলেও, ম্যাক্রোবেঞ্চমার্ক রানের মধ্যে প্রোগ্রাম্যাটিকভাবে এই ট্রেসগুলি ক্যাপচার করার জন্য আপনার বেঞ্চমার্ক মডিউলের ভিতরে অতিরিক্ত কনফিগারেশনের প্রয়োজন হয়।
সম্পূর্ণ সেটআপ নির্দেশাবলীর জন্য, Jetpack Macrobenchmark দিয়ে একটি ট্রেস ক্যাপচার দেখুন।
পাওয়ারমেট্রিক
PowerMetric আপনার ম্যাক্রোবেঞ্চমার্ক রান চলাকালীন শক্তি বা পাওয়ারের পরিবর্তন রেকর্ড করে। প্রতিটি নির্বাচিত বিভাগকে তার পরিমাপযোগ্য হার্ডওয়্যার উপাদানগুলিতে বিভক্ত করা হয়, এবং অনির্দিষ্ট বিভাগগুলিকে একটি "অনির্বাচিত" বিভাগে রাখা হয়।
হার্ডওয়্যার প্রয়োজনীয়তা : এই মেট্রিকগুলো অ্যাপ-ভিত্তিক গণনার পরিবর্তে সিস্টেম-ব্যাপী ব্যবহার পরিমাপ করে। ফলস্বরূপ, ডেটা সংগ্রহ শুধুমাত্র ফিজিক্যাল গুগল পিক্সেল ৬, পিক্সেল ৬ প্রো এবং নতুন ফিজিক্যাল ডিভাইসগুলোর মধ্যেই সীমাবদ্ধ।
এই মেট্রিকটি প্রতিটি বিভাগের জন্য দুটি পরিমাপ প্রদান করে:
-
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: আপনার পরীক্ষা চলাকালীন সিপিইউ দ্বারা ব্যবহৃত বিদ্যুতের পরিমাণ। -
powerCategoryGpuUw: আপনার পরীক্ষার সময়কালে GPU দ্বারা ব্যবহৃত বিদ্যুতের পরিমাণ। -
powerUnselectedUw: আপনার ইনিশিয়ালাইজেশন ম্যাপে স্পষ্টভাবে অনুরোধ করা হয়নি এমন সমস্ত উপলব্ধ হার্ডওয়্যার ক্যাটাগরি দ্বারা ব্যবহৃত মোট বিদ্যুৎ।
রান চলাকালীন হার্ডওয়্যার রেইলে ডেটার আকস্মিক বৃদ্ধি রোধ করতে, ম্যাক্রোবেঞ্চমার্ক লুপ শুরু করার আগে স্ক্রিনের উজ্জ্বলতা একটি নির্দিষ্ট মানে লক করুন, ডিভাইসের তাপমাত্রা স্থিতিশীল রাখুন এবং প্রতিযোগী ব্যাকগ্রাউন্ড প্রসেসগুলো বন্ধ করুন।
অতিরিক্ত সম্পদ
বিষয়বস্তু দেখুন
{% হুবহু %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- বেসলাইন প্রোফাইল তৈরি করুন {:#creating-profile-rules}
- একটি ম্যাক্রোবেঞ্চমার্ক লেখা
- অ্যাপ স্টার্টআপ বিশ্লেষণ এবং অপ্টিমাইজেশন {:#app-startup-analysis-optimization}