ক্রমাগত ইন্টিগ্রেশনে বেঞ্চমার্ক

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

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

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

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

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

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

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

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

নির্মাণ করুন

Microbenchmark লাইব্রেরির জন্য, Gradle টাস্ক assemble[VariantName]AndroidTest চালান, যা আপনার পরীক্ষার APK তৈরি করে যাতে আপনার অ্যাপ্লিকেশন কোডের পাশাপাশি আপনার পরীক্ষিত কোড উভয়ই থাকে।

বিকল্পভাবে, ম্যাক্রোবেঞ্চমার্ক লাইব্রেরির জন্য আপনাকে আপনার টার্গেট APK তৈরি করতে হবে এবং আলাদাভাবে APK পরীক্ষা করতে হবে। তাই চালান :app:assemble[VariantName] এবং :macrobenchmark:assemble[VariantName] Gradle টাস্ক।

ইনস্টল করুন এবং চালান

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

ইনস্টলেশনের জন্য, adb install কমান্ড ব্যবহার করুন এবং পরীক্ষা APK বা লক্ষ্য APK নির্দিষ্ট করুন।

সমস্ত বেঞ্চমার্ক চালানোর জন্য adb shell am instrument কমান্ডটি চালান:

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

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

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

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

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

কমান্ড লাইন থেকে ইন্সট্রুমেন্টেশন পরীক্ষা চালানোর বিষয়ে আরও তথ্যের জন্য, ADB এর সাথে পরীক্ষা চালান দেখুন।

ঘড়ি তালা

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

আপনি হয় সরাসরি লিনাক্স বা ম্যাক হোস্ট থেকে স্ক্রিপ্টটি চালাতে পারেন, অথবা আপনি কয়েকটি অ্যাডবি কমান্ড দিয়ে ডিভাইসে ধাক্কা দিতে পারেন:

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 ঘড়ি লক করা সহায়ক সে সম্পর্কে আরও তথ্যের জন্য, কীভাবে সামঞ্জস্যপূর্ণ বেঞ্চমার্ক পেতে হয় তা দেখুন।

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

বেঞ্চমার্কিং লাইব্রেরিগুলি JSON- এ পরিমাপ আউটপুট করে, প্রতিটি বেঞ্চমার্ক চালানোর পরে Android-চালিত ডিভাইসে একটি ডিরেক্টরির প্রোফাইলিং ট্রেস সহ। ম্যাক্রোবেঞ্চমার্ক লাইব্রেরি একাধিক পারফেটো ট্রেস ফাইল আউটপুট করে: প্রতিটি MacrobenchmarkRule.measureRepeated লুপের প্রতি মাপা পুনরাবৃত্তির জন্য একটি। মাইক্রোবেঞ্চমার্ক , তবে, প্রতিটি 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
        }
    ]
}

অতিরিক্ত সম্পদ

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}