কন্টিনিউয়াস ইন্টিগ্রেশনে বেঞ্চমার্ক

আপনি সময়ের সাথে সাথে পারফর্ম্যান্স ট্র্যাক করতে এবং আপনার অ্যাপ রিলিজ হওয়ার আগেই পারফর্ম্যান্স রিগ্রেশন—বা উন্নতি—শনাক্ত করতে, কন্টিনিউয়াস ইন্টিগ্রেশনে (CI) বেঞ্চমার্ক রান করতে পারেন। এই পৃষ্ঠায় CI-তে বেঞ্চমার্কিং সম্পর্কে প্রাথমিক তথ্য দেওয়া হয়েছে।

CI-তে বেঞ্চমার্কিং শুরু করার আগে, ফলাফল ক্যাপচার এবং মূল্যায়ন করা নিয়মিত পরীক্ষার থেকে কীভাবে আলাদা তা বিবেচনা করুন।

অস্পষ্ট ফলাফল

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

আসল ডিভাইস ব্যবহার করুন

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

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

আপনার CI পাইপলাইনের অংশ হিসেবে বেঞ্চমার্ক রান করা, Android Studio থেকে স্থানীয়ভাবে এটি রান করার থেকে আলাদা হতে পারে। লোকাল ডিভাইসে, আপনি সাধারণত একটি Gradle connectedCheck টাস্কের মাধ্যমে Android ইন্টিগ্রেশন টেস্ট রান করেন। এই টাস্ক অটোমেটিক আপনার APK এবং টেস্ট APK তৈরি করে এবং CI সার্ভারের সাথে কানেক্ট করা ডিভাইসে টেস্ট রান করে। CI-তে রান করার সময়, এই ফ্লো সাধারণত আলাদা আলাদা ফেজে বিভক্ত করতে হয়।

বিল্ড

Microbenchmark লাইব্রেরির জন্য, Gradle টাস্ক assemble[VariantName]AndroidTest রান করুন, যা আপনার টেস্ট APK তৈরি করে, যার মধ্যে আপনার অ্যাপ্লিকেশন কোড এবং টেস্ট করা কোড, দুটিই থাকে।

অন্যভাবে, Macrobenchmark লাইব্রেরির জন্য আপনাকে টার্গেট APK এবং টেস্ট APK আলাদাভাবে তৈরি করতে হবে। তাই :app:assemble[VariantName] এবং :macrobenchmark:assemble[VariantName] Gradle টাস্ক রান করুন।

ইনস্টল করে রান করুন

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

ইনস্টল করার জন্য, adb install কমান্ড ব্যবহার করুন এবং টেস্ট APK বা টার্গেট APK উল্লেখ করুন।

সব বেঞ্চমার্ক রান করতে adb shell am ইনস্ট্রুমেন্ট কমান্ড রান করুন:

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Macrobenchmark লাইব্রেরি ব্যবহার করার সময়, ইনস্ট্রুমেন্টেশন রানার হিসেবে রেগুলার androidx.test.runner.AndroidJUnitRunner ব্যবহার করুন।

আপনি -e আর্গুমেন্ট ব্যবহার করে Gradle কনফিগারেশনের মতো একই ইন্সট্রুমেন্টেশন আর্গুমেন্ট পাস করতে পারেন। সব ইনস্ট্রুমেন্টেশন আর্গুমেন্ট বিকল্পের জন্য, Microbenchmark ইনস্ট্রুমেন্টেশন আর্গুমেন্ট অথবা Macrobenchmark-এর জন্য ইনস্ট্রুমেন্টেশন আর্গুমেন্ট যোগ করুন দেখুন।

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

adb shell am instrument -w -e "androidx.benchmark.dryRunMode.enable" "true" com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

কমান্ড লাইন থেকে কীভাবে ইন্সট্রুমেন্টেশন টেস্ট রান করতে হয় সেই সম্পর্কে আরও তথ্য পেতে, ADB-এর মাধ্যমে টেস্ট রান করুন বিকল্প দেখুন।

ঘড়ি লক করুন

Microbenchmark Gradle প্লাগ-ইন, রুট করা ডিভাইসের CPU ক্লক লক করার জন্য ./gradlew lockClocks কমান্ড প্রদান করে। "userdebug" বিল্ডের মতো রুট করা ডিভাইসে আপনার অ্যাক্সেস থাকলে, এটি স্থায়িত্ব নিশ্চিত করার জন্য উপযোগী। আপনি lockClocks.sh শেল স্ক্রিপ্টের মাধ্যমে এটি রেপ্লিকেট করতে পারবেন, যা লাইব্রেরির সোর্স-এ উপলভ্য।

আপনি Linux বা Mac হোস্ট থেকে সরাসরি স্ক্রিপ্ট রান করতে পারেন অথবা কয়েকটি adb কমান্ডের মাধ্যমে ডিভাইসে পুশ করতে পারেন:

adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
adb shell /data/local/tmp/lockClocks.sh
adb shell rm /data/local/tmp/lockClocks.sh

আপনি যদি সরাসরি কোনও হোস্টে শেল স্ক্রিপ্ট চালান, তাহলে এটি কানেক্ট করা ডিভাইসে এইসব কমান্ড পাঠায়।

CPU ক্লক লক করা কেন সহায়ক সেই সম্পর্কে আরও তথ্য পেতে, কীভাবে একই ধরনের বেঞ্চমার্ক পাওয়া যায় তা দেখুন।

ফলাফল সংগ্রহ করুন

বেঞ্চমার্কিং লাইব্রেরিগুলি প্রতিটি বেঞ্চমার্ক রান করার পরে Android-চালিত ডিভাইসের একটি ডিরেক্টরিতে প্রোফাইলিং ট্রেস সহ JSON-এ পরিমাপ আউটপুট করে। Macrobenchmark লাইব্রেরি একাধিক পারফেটো ট্রেস ফাইল আউটপুট করে: প্রতিটি MacrobenchmarkRule.measureRepeated লুপের পরিমাপ করা পুনরাবৃত্তির জন্য একটি করে। তবে, Microbenchmark প্রতিটি BenchmarkRule.measureRepeated-এর সবকটি ইটারেশনের জন্য মাত্র একটি ট্রেস ফাইল তৈরি করে। প্রোফাইলিং ট্রেস ফাইলও এই একই ডিরেক্টরিতে আউটপুট হিসেবে দেখানো হয়।

ফাইল সেভ ও লোকেট করা

আপনি Gradle-এর মাধ্যমে বেঞ্চমার্ক রান করলে, এইসব ফাইল অটোমেটিক আপনার হোস্ট কম্পিউটারের আউটপুট ডিরেক্টরিতে build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/-এর অধীনে কপি হয়ে যায়।

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

Benchmark: writing results to /storage/emulated/0/Android/media/com.example.macrobenchmark/com.example.macrobenchmark-benchmarkData.json

এছাড়াও, আপনি ইন্সট্রুমেন্টেশন আর্গুমেন্ট additionalTestOutputDir ব্যবহার করে ডিভাইসে বেঞ্চমার্ক রিপোর্ট সেভ করার লোকেশন কনফিগার করতে পারেন। এই ফোল্ডারটি আপনার অ্যাপের মাধ্যমে রাইট করার উপযুক্ত হতে হবে।

adb shell am instrument -w -e additionalTestOutputDir /sdcard/Download/ com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Android 10 (API লেভেল 29) এবং তার পরবর্তী ভার্সনে, আপনার অ্যাপের টেস্ট ডিফল্ট হিসেবে স্টোরেজ স্যান্ডবক্সে রান করে যা আপনার অ্যাপকে অ্যাপ-নির্দিষ্ট ডিরেক্টরির বাইরে ফাইল অ্যাক্সেস করা থেকে আটকায়। /sdcard/Download-এর মতো গ্লোবাল ডিরেক্টরিতে সেভ করতে, নিম্নলিখিত ইনস্ট্রুমেন্টেশন আর্গুমেন্ট পাস করুন:

-e no-isolated-storage true

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

<application android:requestLegacyExternalStorage="true" ... >

আরও তথ্যের জন্য, স্কোপড স্টোরেজ থেকে সাময়িকভাবে অপ্ট-আউট করুন বিকল্প দেখুন।

ফাইল ফিরিয়ে আনুন

ডিভাইস থেকে জেনারেট করা ফাইলগুলি ফিরিয়ে আনতে, adb pull কমান্ড ব্যবহার করুন, যা আপনার হোস্টের বর্তমান ডিরেক্টরিতে নির্দিষ্ট ফাইলটি নিয়ে আসে:

adb pull /storage/emulated/0/Android/media/com.example.macrobenchmark/com.example.macrobenchmark-benchmarkData.json

নির্দিষ্ট ফোল্ডার থেকে সব benchmarkData ফিরিয়ে আনতে, নিম্নলিখিত স্নিপেট চেক করুন:

# The following command pulls all files ending in -benchmarkData.json from the directory
# hierarchy starting at the root /storage/emulated/0/Android.
adb shell find /sdcard/Download -name "*-benchmarkData.json" | tr -d '\r' | xargs -n1 adb pull

ট্রেস ফাইল (.trace বা .perfetto-trace) benchmarkData.json-এর মতো একই ফোল্ডারে সেভ করা হয়, তাই আপনি একই উপায়ে সেগুলি সংগ্রহ করতে পারবেন।

বেঞ্চমার্ক ডেটার উদাহরণ

বেঞ্চমার্ক লাইব্রেরি JSON ফাইল তৈরি করে যাতে যে ডিভাইসে বেঞ্চমার্ক রান করা হয়েছে এবং যে প্রকৃত বেঞ্চমার্ক রান করা হয়েছে সেই সংক্রান্ত তথ্য থাকে। নিম্নলিখিত স্নিপেট জেনারেট করা JSON ফাইলকে দেখায়:

{
    "context": {
        "build": {
            "brand": "google",
            "device": "blueline",
            "fingerprint": "google/blueline/blueline:12/SP1A.210812.015/7679548:user/release-keys",
            "model": "Pixel 3",
            "version": {
                "sdk": 31
            }
        },
        "cpuCoreCount": 8,
        "cpuLocked": false,
        "cpuMaxFreqHz": 2803200000,
        "memTotalBytes": 3753299968,
        "sustainedPerformanceModeEnabled": false
    },
    "benchmarks": [
        {
            "name": "startup",
            "params": {},
            "className": "com.example.macrobenchmark.startup.SampleStartupBenchmark",
            "totalRunTimeNs": 4975598256,
            "metrics": {
                "timeToInitialDisplayMs": {
                    "minimum": 347.881076,
                    "maximum": 347.881076,
                    "median": 347.881076,
                    "runs": [
                        347.881076
                    ]
                }
            },
            "sampledMetrics": {},
            "warmupIterations": 0,
            "repeatIterations": 3,
            "thermalThrottleSleepSeconds": 0
        }
    ]
}

অতিরিক্ত রিসোর্স