একটি মাইক্রোবেঞ্চমার্ক লিখ

আপনার অ্যাপ্লিকেশন কোডে পরিবর্তন এনে মাইক্রোবেঞ্চমার্ক লাইব্রেরি কীভাবে ব্যবহার করতে হয় তা জানতে, কুইকস্টার্ট বিভাগটি দেখুন। আপনার কোডবেসে আরও জটিল পরিবর্তন এনে কীভাবে একটি সম্পূর্ণ সেটআপ সম্পন্ন করতে হয় তা জানতে, সম্পূর্ণ প্রজেক্ট সেটআপ বিভাগটি দেখুন।

কুইকস্টার্ট

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

এককালীন বেঞ্চমার্কিং করার জন্য, নিম্নলিখিতগুলি করুন:

  1. আপনার মডিউলের 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 ব্যবহার করেন, তাহলে বেঞ্চমার্কগুলো চলতে ব্যর্থ হয়, কারণ লাইব্রেরি ম্যানিফেস্টটি অ্যাপ ম্যানিফেস্টের সাথে মার্জ করা হয় না।

  2. debug বিল্ড টাইপটি আপডেট করুন যাতে এটি ডিবাগযোগ্য না থাকে:

    কোটলিন

    android {
        ...
        buildTypes {
            debug {
                isDebuggable = false
            }
        }
    }

    গ্রুভি

    android {
        ...
        buildTypes {
            debug {
                debuggable false
            }
        }
    }
  3. testInstrumentationRunner AndroidBenchmarkRunner এ পরিবর্তন করুন:

    কোটলিন

    android {
        ...
        defaultConfig {
            testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
        }
    }

    গ্রুভি

    android {
        ...
        defaultConfig {
            testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
        }
    }
  4. আপনার বেঞ্চমার্ক যোগ করতে androidTest ডিরেক্টরির একটি টেস্ট ফাইলে BenchmarkRule এর একটি ইনস্ট্যান্স যোগ করুন। বেঞ্চমার্ক লেখার বিষয়ে আরও তথ্যের জন্য, "Create a Microbenchmark class" দেখুন।

    নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে একটি ইন্সট্রুমেন্টেড টেস্টে বেঞ্চমার্ক যোগ করতে হয়:

    কোটলিন

    @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()
                );
           }
        }
    }

কীভাবে একটি বেঞ্চমার্ক লিখতে হয় তা জানতে, "Create a Microbenchmark class" অংশে চলে যান।

সম্পূর্ণ প্রজেক্ট সেটআপ

এককালীন বেঞ্চমার্কিংয়ের পরিবর্তে নিয়মিত বেঞ্চমার্কিং সেট আপ করতে, বেঞ্চমার্কগুলোকে তাদের নিজস্ব মডিউলে আলাদা করুন। এটি নিশ্চিত করতে সাহায্য করে যে তাদের কনফিগারেশন, যেমন debuggable কে false সেট করা, সাধারণ টেস্টগুলো থেকে পৃথক থাকে।

যেহেতু মাইক্রোবেঞ্চমার্ক আপনার কোড সরাসরি রান করে, তাই যে কোডটির বেঞ্চমার্ক করতে চান, সেটিকে একটি আলাদা গ্রেডল মডিউলে রাখুন এবং চিত্র ১-এ দেখানো অনুযায়ী সেই মডিউলটির উপর ডিপেন্ডেন্সি সেট করুন।

অ্যাপ কাঠামো
চিত্র ১. :app , :microbenchmark , এবং :benchmarkable গ্রেডল মডিউলসহ অ্যাপের কাঠামো, যা মাইক্রোবেঞ্চমার্কসকে :benchmarkable মডিউলের কোড বেঞ্চমার্ক করতে দেয়।

একটি নতুন গ্রেডল মডিউল যোগ করতে, আপনি অ্যান্ড্রয়েড স্টুডিও-এর মডিউল উইজার্ড ব্যবহার করতে পারেন। উইজার্ডটি বেঞ্চমার্কিংয়ের জন্য পূর্ব-কনফিগার করা একটি মডিউল তৈরি করে, যেখানে একটি বেঞ্চমার্ক ডিরেক্টরি যুক্ত থাকে এবং debuggable বিকল্পটি 'ফলস' ( false ) সেট করা থাকে।

  1. অ্যান্ড্রয়েড স্টুডিওর প্রজেক্ট প্যানেলে আপনার প্রজেক্ট বা মডিউলের উপর রাইট-ক্লিক করুন এবং New > Module-এ ক্লিক করুন।

  2. টেমপ্লেট প্যানে বেঞ্চমার্ক নির্বাচন করুন।

  3. বেঞ্চমার্ক মডিউলের ধরন হিসেবে মাইক্রোবেঞ্চমার্ক নির্বাচন করুন।

  4. মডিউলের নাম হিসেবে 'microbenchmark' টাইপ করুন।

  5. শেষ করুন- এ ক্লিক করুন।

নতুন লাইব্রেরি মডিউল কনফিগার করুন
চিত্র ২. অ্যান্ড্রয়েড স্টুডিও বাম্বলবি-তে একটি নতুন গ্রেডল মডিউল যোগ করুন।

মডিউলটি তৈরি হয়ে গেলে, এর 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 মতোই আপনার বেঞ্চমার্কটি চালান।

মাইক্রোবেঞ্চমার্ক চালান
চিত্র ৩। একটি টেস্ট ক্লাসের পাশে গাটার অ্যাকশন ব্যবহার করে মাইক্রোবেঞ্চমার্ক টেস্ট চালান।

বিকল্পভাবে, কমান্ড লাইন থেকে নির্দিষ্ট গ্রেডল মডিউলের সমস্ত টেস্ট চালানোর জন্য connectedCheck চালান:

./gradlew benchmark:connectedCheck

অথবা একটি একক পরীক্ষা:

./gradlew benchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.benchmark.SampleBenchmark#benchmarkSomeWork

বেঞ্চমার্ক ফলাফল

সফলভাবে মাইক্রোবেঞ্চমার্ক চালানোর পর, মেট্রিকগুলো সরাসরি অ্যান্ড্রয়েড স্টুডিওতে প্রদর্শিত হয় এবং অতিরিক্ত মেট্রিক ও ডিভাইসের তথ্যসহ একটি সম্পূর্ণ বেঞ্চমার্ক রিপোর্ট 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 এ অবস্থিত।

কনফিগারেশন ত্রুটি

আপনার প্রজেক্ট এবং এনভায়রনমেন্ট রিলিজ-সঠিক পারফরম্যান্সের জন্য প্রস্তুত আছে কিনা, তা নিশ্চিত করতে লাইব্রেরিটি নিম্নলিখিত শর্তগুলো শনাক্ত করে:

  • Debuggable-এর মান false সেট করা আছে।
  • একটি ভৌত ​​ডিভাইস ব্যবহার করা হচ্ছে—এমুলেটর সমর্থিত নয়।
  • ডিভাইসটি রুট করা থাকলে ঘড়িগুলো লক হয়ে যায়।
  • ডিভাইসের ব্যাটারিতে কমপক্ষে ২৫% চার্জ থাকতে হবে।

পূর্ববর্তী যাচাইগুলোর কোনোটি ব্যর্থ হলে, ভুল পরিমাপ নিরুৎসাহিত করার জন্য বেঞ্চমার্কটি একটি ত্রুটি প্রতিবেদন করে।

নির্দিষ্ট ধরনের ত্রুটিকে সতর্কীকরণ হিসেবে দমন করতে এবং সেগুলোর কারণে বেঞ্চমার্ক থেমে যাওয়া রোধ করতে, ত্রুটির ধরনটিকে একটি কমা-দ্বারা-বিভক্ত তালিকা হিসেবে 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_ যুক্ত হয়ে যায়।

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}