আপনার অ্যাপ্লিকেশন কোডে পরিবর্তন যোগ করে মাইক্রোবেঞ্চমার্ক লাইব্রেরি কীভাবে ব্যবহার করবেন তা শিখতে, কুইকস্টার্ট বিভাগটি দেখুন। আপনার কোডবেসে আরও জটিল পরিবর্তন সহ একটি সম্পূর্ণ সেটআপ সম্পূর্ণ করতে শিখতে, সম্পূর্ণ প্রকল্প সেটআপ বিভাগটি দেখুন।
কুইকস্টার্ট
এই বিভাগটি দেখায় কিভাবে বেঞ্চমার্কিং চেষ্টা করে দেখতে হয় এবং মডিউলে কোড সরানোর প্রয়োজন ছাড়াই এক-অফ পরিমাপ চালাতে হয়। সঠিক পারফরম্যান্স ফলাফলের জন্য, এই পদক্ষেপগুলি আপনার অ্যাপে ডিবাগিং অক্ষম করা জড়িত, তাই আপনার উত্স নিয়ন্ত্রণ সিস্টেমে পরিবর্তন না করে এটিকে একটি স্থানীয় কার্যকরী অনুলিপিতে রাখুন৷
এক-অফ বেঞ্চমার্কিং করতে, নিম্নলিখিতগুলি করুন:
আপনার মডিউলের
build.gradle
বাbuild.gradle.kts
ফাইলে লাইব্রেরি যোগ করুন:কোটলিন
dependencies { implementation("androidx.benchmark:benchmark-junit4:1.2.4") }
গ্রোভি
dependencies { implementation 'androidx.benchmark:benchmark-junit4:1.2.4' }
একটি
androidTestImplementation
নির্ভরতার পরিবর্তে একটিimplementation
নির্ভরতা ব্যবহার করুন। আপনিandroidTestImplementation
ব্যবহার করলে, বেঞ্চমার্কগুলি চলতে ব্যর্থ হয় কারণ লাইব্রেরি ম্যানিফেস্ট অ্যাপ ম্যানিফেস্টে মার্জ করা হয়নি।debug
বিল্ড টাইপ আপডেট করুন যাতে এটি ডিবাগযোগ্য না হয়:কোটলিন
android { ... buildTypes { debug { isDebuggable = false } } }
গ্রোভি
android { ... buildTypes { debug { debuggable false } } }
testInstrumentationRunner
কেAndroidBenchmarkRunner
হতে পরিবর্তন করুন:কোটলিন
android { ... defaultConfig { testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
গ্রোভি
android { ... defaultConfig { testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
আপনার বেঞ্চমার্ক যোগ করতে
androidTest
ডিরেক্টরিতে একটি পরীক্ষা ফাইলেBenchmarkRule
এর একটি উদাহরণ যোগ করুন। বেঞ্চমার্ক লেখার বিষয়ে আরও তথ্যের জন্য, একটি মাইক্রোবেঞ্চমার্ক ক্লাস তৈরি করুন দেখুন।নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে একটি যন্ত্রযুক্ত পরীক্ষায় একটি বেঞ্চমার্ক যোগ করতে হয়:
কোটলিন
@RunWith(AndroidJUnit4::class) class SampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() { benchmarkRule.measureRepeated { doSomeWork() } } }
জাভা
@RunWith(AndroidJUnit4.class) class SampleBenchmark { @Rule public BenchmarkRule benchmarkRule = new BenchmarkRule(); @Test public void benchmarkSomeWork() { BenchmarkRuleKt.measureRepeated( (Function1<BenchmarkRule.Scope, Unit>) scope -> doSomeWork() ); } } }
কিভাবে একটি বেঞ্চমার্ক লিখতে হয় তা শিখতে, একটি মাইক্রোবেঞ্চমার্ক ক্লাস তৈরি করুন এ যান।
সম্পূর্ণ প্রকল্প সেটআপ
এক-অফ বেঞ্চমার্কিংয়ের পরিবর্তে নিয়মিত বেঞ্চমার্কিং সেট আপ করতে, বেঞ্চমার্কগুলিকে তাদের নিজস্ব মডিউলে আলাদা করুন। এটি নিশ্চিত করতে সাহায্য করে যে তাদের কনফিগারেশন, যেমন debuggable
সেটিং false
, নিয়মিত পরীক্ষা থেকে আলাদা।
যেহেতু মাইক্রোবেঞ্চমার্ক আপনার কোডটি সরাসরি চালায়, আপনি যে কোডটি বেঞ্চমার্ক করতে চান সেটিকে একটি পৃথক গ্রেডল মডিউলে রাখুন এবং চিত্র 1-এ দেখানো হিসাবে সেই মডিউলের উপর নির্ভরতা সেট করুন।
একটি নতুন Gradle মডিউল যোগ করতে, আপনি Android স্টুডিওতে মডিউল উইজার্ড ব্যবহার করতে পারেন। উইজার্ড একটি মডিউল তৈরি করে যা বেঞ্চমার্কিংয়ের জন্য পূর্ব-কনফিগার করা হয়, একটি বেঞ্চমার্ক ডিরেক্টরি যোগ করা হয় এবং debuggable
সেট করা হয় false
।
অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্ট প্যানেলে আপনার প্রোজেক্ট বা মডিউলে ডান-ক্লিক করুন এবং নতুন > মডিউল-এ ক্লিক করুন।
টেমপ্লেট প্যানে বেঞ্চমার্ক নির্বাচন করুন।
বেঞ্চমার্ক মডিউল টাইপ হিসাবে মাইক্রোবেঞ্চমার্ক নির্বাচন করুন।
মডিউল নামের জন্য "মাইক্রোবেঞ্চমার্ক" টাইপ করুন।
শেষ ক্লিক করুন.
মডিউলটি তৈরি হওয়ার পরে, এর build.gradle
বা build.gradle.kts
ফাইলটি পরিবর্তন করুন এবং বেঞ্চমার্কে কোড ধারণকারী মডিউলটিতে androidTestImplementation
যোগ করুন:
কোটলিন
dependencies { // The module name might be different. androidTestImplementation(project(":benchmarkable")) }
গ্রোভি
dependencies { // The module name might be different. androidTestImplementation project(':benchmarkable') }
একটি মাইক্রোবেঞ্চমার্ক ক্লাস তৈরি করুন
মানদণ্ড হল প্রমিত ইন্সট্রুমেন্টেশন পরীক্ষা। একটি বেঞ্চমার্ক তৈরি করতে, লাইব্রেরি দ্বারা প্রদত্ত BenchmarkRule
ক্লাস ব্যবহার করুন। বেঞ্চমার্ক ক্রিয়াকলাপ করতে, ActivityScenario
বা ActivityScenarioRule
ব্যবহার করুন। UI কোড বেঞ্চমার্ক করতে, @UiThreadTest
ব্যবহার করুন।
নিম্নলিখিত কোড একটি নমুনা বেঞ্চমার্ক দেখায়:
কোটলিন
@RunWith(AndroidJUnit4::class) class SampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() { benchmarkRule.measureRepeated { doSomeWork() } } }
জাভা
@RunWith(AndroidJUnit4.class) class SampleBenchmark { @Rule public BenchmarkRule benchmarkRule = new BenchmarkRule(); @Test public void benchmarkSomeWork() { final BenchmarkState state = benchmarkRule.getState(); while (state.keepRunning()) { doSomeWork(); } } }
সেটআপের জন্য সময় নিষ্ক্রিয় করুন
আপনি runWithTimingDisabled{}
ব্লক দিয়ে পরিমাপ করতে চান না এমন কোডের বিভাগগুলির জন্য সময় নিষ্ক্রিয় করতে পারেন৷ এই বিভাগগুলি সাধারণত কিছু কোড উপস্থাপন করে যা আপনাকে বেঞ্চমার্কের প্রতিটি পুনরাবৃত্তিতে চালাতে হবে।
কোটলিন
// using random with the same seed, so that it generates the same data every run private val random = Random(0) // create the array once and just copy it in benchmarks private val unsorted = IntArray(10_000) { random.nextInt() } @Test fun benchmark_quickSort() { // ... benchmarkRule.measureRepeated { // copy the array with timing disabled to measure only the algorithm itself listToSort = runWithTimingDisabled { unsorted.copyOf() } // sort the array in place and measure how long it takes SortingAlgorithms.quickSort(listToSort) } // assert only once not to add overhead to the benchmarks assertTrue(listToSort.isSorted) }
জাভা
private final int[] unsorted = new int[10000]; public SampleBenchmark() { // Use random with the same seed, so that it generates the same data every // run. Random random = new Random(0); // Create the array once and copy it in benchmarks. Arrays.setAll(unsorted, (index) -> random.nextInt()); } @Test public void benchmark_quickSort() { final BenchmarkState state = benchmarkRule.getState(); int[] listToSort = new int[0]; while (state.keepRunning()) { // Copy the array with timing disabled to measure only the algorithm // itself. state.pauseTiming(); listToSort = Arrays.copyOf(unsorted, 10000); state.resumeTiming(); // Sort the array in place and measure how long it takes. SortingAlgorithms.quickSort(listToSort); } // Assert only once, not to add overhead to the benchmarks. assertTrue(SortingAlgorithmsKt.isSorted(listToSort)); }
measureRepeated
ব্লকের ভিতরে এবং runWithTimingDisabled
ভিতরে সম্পন্ন কাজের পরিমাণ কমানোর চেষ্টা করুন। measureRepeated
ব্লকটি একাধিকবার চালানো হয় এবং এটি বেঞ্চমার্ক চালানোর জন্য প্রয়োজনীয় সামগ্রিক সময়কে প্রভাবিত করতে পারে। আপনি যদি একটি বেঞ্চমার্কের কিছু ফলাফল যাচাই করতে চান, তাহলে আপনি বেঞ্চমার্কের প্রতিটি পুনরাবৃত্তি করার পরিবর্তে শেষ ফলাফলটি নিশ্চিত করতে পারেন।
বেঞ্চমার্ক চালান
অ্যান্ড্রয়েড স্টুডিওতে, আপনার পরীক্ষার ক্লাস বা পদ্ধতির পাশে গটার অ্যাকশন ব্যবহার করে যেকোন @Test
এর সাথে আপনার বেঞ্চমার্ক চালান, যেমন চিত্র 3-এ দেখানো হয়েছে।
বিকল্পভাবে, কমান্ড লাইন থেকে, নির্দিষ্ট গ্রেডল মডিউল থেকে সমস্ত পরীক্ষা চালানোর জন্য connectedCheck
চালান:
./gradlew benchmark:connectedCheck
অথবা একটি একক পরীক্ষা:
./gradlew benchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.benchmark.SampleBenchmark#benchmarkSomeWork
বেঞ্চমার্ক ফলাফল
একটি সফল মাইক্রোবেঞ্চমার্ক চালানোর পরে, মেট্রিকগুলি সরাসরি Android স্টুডিওতে প্রদর্শিত হয় এবং অতিরিক্ত মেট্রিক্স এবং ডিভাইসের তথ্য সহ একটি সম্পূর্ণ বেঞ্চমার্ক রিপোর্ট JSON ফর্ম্যাটে পাওয়া যায়।
JSON রিপোর্ট এবং যেকোনো প্রোফাইলিং ট্রেসও স্বয়ংক্রিয়ভাবে ডিভাইস থেকে হোস্টে কপি করা হয়। এইগুলি নিম্নলিখিত অবস্থানে হোস্ট মেশিনে লেখা আছে:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
ডিফল্টরূপে, JSON রিপোর্টটি টেস্ট APK-এর এক্সটার্নাল শেয়ার্ড মিডিয়া ফোল্ডারে ডিস্ক-অন-ডিভাইস-এ লেখা হয়, যা সাধারণত /storage/emulated/0/Android/media/**app_id**/**app_id**-benchmarkData.json
এ থাকে। /storage/emulated/0/Android/media/**app_id**/**app_id**-benchmarkData.json
।
কনফিগারেশন ত্রুটি
আপনার প্রকল্প এবং পরিবেশ রিলিজ-সঠিক পারফরম্যান্সের জন্য সেট আপ করা হয়েছে তা নিশ্চিত করতে লাইব্রেরি নিম্নলিখিত শর্তগুলি সনাক্ত করে:
- ডিবাগেবল
false
সেট করা হয়েছে। - একটি শারীরিক ডিভাইস ব্যবহার করা হচ্ছে — এমুলেটর সমর্থিত নয়।
- ডিভাইস রুট করা থাকলে ঘড়ি লক করা হয়।
- কমপক্ষে 25% ডিভাইসে পর্যাপ্ত ব্যাটারি স্তর।
যদি পূর্ববর্তী কোনো চেক ব্যর্থ হয়, বেঞ্চমার্ক ভুল পরিমাপকে নিরুৎসাহিত করতে একটি ত্রুটি রিপোর্ট করে।
সতর্কতা হিসাবে নির্দিষ্ট ত্রুটির ধরনগুলিকে দমন করতে এবং বেঞ্চমার্ককে থামানো থেকে আটকাতে, ত্রুটির ধরণটিকে একটি কমা-বিভাজিত তালিকায় ইনস্ট্রুমেন্টেশন আর্গুমেন্ট androidx.benchmark.suppressErrors
এ পাস করুন।
আপনি এটিকে আপনার গ্রেডল স্ক্রিপ্ট থেকে সেট করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
গ্রোভি
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
আপনি কমান্ড লাইন থেকে ত্রুটিগুলি দমন করতে পারেন:
$ ./gradlew :benchmark:connectedCheck -P andoidtestInstrumentationRunnerArguments.androidx.benchmark.supperssErrors=DEBUGGABLE,LOW-BATTERY
ত্রুটিগুলি দমন করা বেঞ্চমার্কটিকে একটি ভুলভাবে কনফিগার করা অবস্থায় চলতে দেয়, এবং বেঞ্চমার্কের আউটপুট ত্রুটির সাথে পরীক্ষার নামগুলিকে ইচ্ছাকৃতভাবে পুনরায় নামকরণ করা হয়৷ উদাহরণস্বরূপ, পূর্ববর্তী স্নিপেটে দমন সহ একটি ডিবাগযোগ্য বেঞ্চমার্ক চালানোর ফলে DEBUGGABLE_
এর সাথে পরীক্ষার নামগুলি প্রিপেন্ড হয়।
আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- একটি ম্যাক্রোবেঞ্চমার্ক লিখুন
- Gradle ছাড়াই মাইক্রোবেঞ্চমার্ক তৈরি করুন
- বেসলাইন প্রোফাইল তৈরি করুন {:#creating-profile-rules}