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

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

কুইকস্টার্ট

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

একবার বেঞ্চমার্কিং করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. আপনার মডিউলের build.gradle বা build.gradle.kts ফাইলে লাইব্রেরি যোগ করুন:

    Kotlin

    dependencies {
        implementation("androidx.benchmark:benchmark-junit4:1.2.4")
    }

    গ্ৰুভি

    dependencies {
        implementation 'androidx.benchmark:benchmark-junit4:1.2.4'
    }

    androidTestImplementation ডিপেন্ডেন্সির পরিবর্তে implementation ডিপেন্ডেন্সি ব্যবহার করুন। আপনি androidTestImplementation ব্যবহার করলে, বেঞ্চমার্ক রান করতে পারে না কারণ লাইব্রেরি ম্যানিফেস্ট অ্যাপ ম্যানিফেস্টে মার্জ করা হয় না।

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

    Kotlin

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

    গ্ৰুভি

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

    Kotlin

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

    গ্ৰুভি

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

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

    Kotlin

    @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-এ সেট করা, নিয়মিত পরীক্ষা থেকে আলাদা।

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

অ্যাপের স্ট্রাকচার
ছবি ১. :app, :microbenchmark ও :benchmarkable Gradle মডিউল সহ অ্যাপ স্ট্রাকচার, যা Microbenchmarks-কে :benchmarkable মডিউলে কোড বেঞ্চমার্ক করতে দেয়।

নতুন Gradle মডিউল যোগ করতে, আপনি Android Studio-তে মডিউল উইজার্ড ব্যবহার করতে পারেন। উইজার্ড একটি মডিউল তৈরি করে যা বেঞ্চমার্কিংয়ের জন্য প্রি-কনফিগার করা হয়, যার সাথে একটি বেঞ্চমার্ক ডিরেক্টরি যোগ করা হয় এবং debuggable-কে false-এ সেট করা হয়।

  1. Android Studio-র প্রোজেক্ট প্যানেলে আপনার প্রোজেক্ট বা মডিউলে মাউস রেখে ডানদিকের বোতামে ক্লিক করুন এবং নতুন > মডিউল বিকল্পে ক্লিক করুন।

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

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

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

  5. সম্পূর্ণ করুন বিকল্পে ক্লিক করুন।

নতুন লাইব্রেরি মডিউল কনফিগার করুন
ছবি ২. Android Studio Bumblebee-তে নতুন Gradle মডিউল যোগ করা।

মডিউল তৈরি করার পরে, এর build.gradle বা build.gradle.kts ফাইল পরিবর্তন করুন এবং বেঞ্চমার্ক করার জন্য কোড সহ মডিউলে androidTestImplementation যোগ করুন:

Kotlin

dependencies {
    // The module name might be different.
    androidTestImplementation(project(":benchmarkable"))
}

গ্ৰুভি

dependencies {
    // The module name might be different.
    androidTestImplementation project(':benchmarkable')
}

Microbenchmark ক্লাস তৈরি করুন

বেঞ্চমার্ক হল স্ট্যান্ডার্ড ইন্সট্রুমেন্টেশন টেস্ট। বেঞ্চমার্ক তৈরি করতে, লাইব্রেরির মাধ্যমে প্রদান করা BenchmarkRule ক্লাস ব্যবহার করুন। অ্যাক্টিভিটি বেঞ্চমার্ক করতে, ActivityScenario বা ActivityScenarioRule ব্যবহার করুন। UI কোড বেঞ্চমার্ক করতে, @UiThreadTest ব্যবহার করুন।

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

Kotlin

@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{} ব্লক দিয়ে পরিমাপ করতে চান না সেগুলির জন্য টাইমিং বন্ধ করতে পারেন। এই বিভাগগুলি সাধারণত কিছু কোডকে উপস্থাপন করে যা আপনাকে বেঞ্চমার্কের প্রতিটি পুনরাবৃত্তিতে চালাতে হবে।

Kotlin

// 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 ব্লক একাধিকবার রান করা হয় এবং এটি বেঞ্চমার্ক রান করার জন্য প্রয়োজনীয় মোট সময়কে প্রভাবিত করতে পারে। আপনি যদি বেঞ্চমার্কের কিছু ফলাফল যাচাই করতে চান, তাহলে বেঞ্চমার্কের প্রতিটি ইটারেশন করার পরিবর্তে আপনি শেষ ফলাফলটি অ্যাসার্ট করতে পারেন।

বেঞ্চমার্ক রান করুন

Android Studio-তে, আপনার বেঞ্চমার্ক রান করুন যেভাবে আপনি যেকোনও @Test-এর সাথে করেন আপনার টেস্ট ক্লাস বা পদ্ধতির পাশে থাকা গাটার অ্যাকশন ব্যবহার করে, যেমনটি চিত্র ৩-এ দেখানো হয়েছে।

মাইক্রোবেঞ্চমার্ক রান করুন
ছবি ৩. টেস্ট ক্লাসের পাশে থাকা গাটার অ্যাকশন ব্যবহার করে Microbenchmark টেস্ট রান করুন।

অথবা, নির্দিষ্ট Gradle মডিউল থেকে সব টেস্ট রান করতে, কমান্ড লাইন থেকে connectedCheck রান করুন:

./gradlew benchmark:connectedCheck

অথবা একটি টেস্ট:

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

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

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

কনফিগারেশন সংক্রান্ত সমস্যা

আপনার প্রোজেক্ট ও পরিবেশ যাতে রিলিজ-অ্যাকুরেট পারফর্ম্যান্সের জন্য সেট-আপ করা হয় তা নিশ্চিত করতে, লাইব্রেরি নিম্নলিখিত শর্তগুলি শনাক্ত করে:

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

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

নির্দিষ্ট ধরনের সমস্যাকে সতর্কতা হিসেবে দমন করতে এবং বেঞ্চমার্ক বন্ধ করা থেকে বিরত রাখতে, ইনস্ট্রুমেন্টেশন আর্গুমেন্ট androidx.benchmark.suppressErrors-এ কমা দ্বারা পৃথক করা তালিকায় সমস্যার ধরন পাস করুন।

আপনি এটি আপনার Gradle স্ক্রিপ্ট থেকে সেট করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

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_ যোগ করা হয়।