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

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

দ্রুত শুরু

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

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

  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 এর একটি উদাহরণ যোগ করুন। বেঞ্চমার্ক লেখার বিষয়ে আরও তথ্যের জন্য, একটি মাইক্রোবেঞ্চমার্ক ক্লাস তৈরি করুন দেখুন।

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

    কোটলিন

    @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-এ দেখানো মডিউলের উপর নির্ভরতা সেট করুন।

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

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

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

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

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

  4. মডিউলের নামের জন্য "মাইক্রোবেঞ্চমার্ক" টাইপ করুন।

  5. Finish এ ক্লিক করুন।

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

মডিউলটি তৈরি হওয়ার পর, এর 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));
}
    

Try to minimize the amount of work done inside the measureRepeated block and inside runWithTimingDisabled . The measureRepeated block is run multiple times and it can affect the overall time needed to run the benchmark. If you need to verify some results of a benchmark, you can assert the last result instead of doing it every iteration of the benchmark.

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

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

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

বিকল্পভাবে, কমান্ড লাইন থেকে, নির্দিষ্ট Gradle মডিউল থেকে সমস্ত পরীক্ষা চালানোর জন্য 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 এ অবস্থিত।

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

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

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

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

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

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

কোটলিন

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_ দিয়ে প্রিপেন্ড করা হয়।

{% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %} {% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %}