توصیه میکنیم از Jetpack Macrobenchmark برای آزمایش عملکرد برنامه درصورت فعال بودن «نمایههای پایه» استفاده کنید و سپس آن نتایج را با محکزنی که در آن «نمایههای پایه» غیرفعال است مقایسه کنید. با این رویکرد، میتوانید زمان راهاندازی برنامه (هم زمان نمایش اولیه و هم زمان نمایش کامل) یا عملکرد پردازش زمان اجرا را اندازهگیری کنید تا ببینید آیا قابهای تولیدشده میتوانند باعث ایجاد لرزش شوند یا نه.
Macrobenchmarks به شما امکان میدهد بااستفاده از میانای برنامهسازی کاربردی CompilationMode، کامپایل پیشاندازهگیری را کنترل کنید. از مقادیر CompilationMode مختلف برای مقایسه
عملکرد با حالتهای مختلف کامپایل استفاده کنید. تکهکد زیر نشان میدهد
چگونه از پارامتر CompilationMode برای اندازهگیری مزیت «نمایههای
پایه» استفاده کنید:
@RunWith(AndroidJUnit4ClassRunner::class) class ColdStartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() // No ahead-of-time (AOT) compilation at all. Represents performance of a // fresh install on a user's device if you don't enable Baseline Profiles— // generally the worst case performance. @Test fun startupNoCompilation() = startup(CompilationMode.None()) // Partial pre-compilation with Baseline Profiles. Represents performance of // a fresh install on a user's device. @Test fun startupPartialWithBaselineProfiles() = startup(CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Require)) // Partial pre-compilation with some just-in-time (JIT) compilation. // Represents performance after some app usage. @Test fun startupPartialCompilation() = startup( CompilationMode.Partial( baselineProfileMode = BaselineProfileMode.Disable, warmupIteration = 3 ) ) // Full pre-compilation. Generally not representative of real user // experience, but can yield more stable performance metrics by removing // noise from JIT compilation within benchmark runs. @Test fun startupFullCompilation() = startup(CompilationMode.Full()) private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( packageName = "com.example.macrobenchmark.target", metrics = listOf(StartupTimingMetric()), compilationMode = compilationMode, iterations = 10, startupMode = StartupMode.COLD, setupBlock = { pressHome() } ) { uiAutomator { startApp(packageName) onElement(5_000) { viewIdResourceName == "my-content"} } } }
در نماگرفت زیر، میتوانید نتایج را مستقیماً در Android Studio برای برنامه نمونه «اکنون در Android» که در Google Pixel 7 اجرا شده است ببینید. نتایج نشان میدهد که راهاندازی برنامه هنگام استفاده از «نمایههای پایه» (۲۲۹٫۰ میلیثانیه) در مقایسه با عدم کامپایل (۳۲۴٫۸ میلیثانیه) سریعترین حالت است.
ColdStartupBenchmark
نشاندهنده زمان لازم برای نمایش اولیه برای بدون کامپایل (۳۲۴ میلیثانیه)، کامپایل کامل
(۳۱۵ میلیثانیه)، کامپایل جزئی (۳۱۲ میلیثانیه)، و «نمایههای پایه»
(۲۲۹ میلیثانیه) است.درحالیکه مثال قبلی نتایج راهاندازی برنامه را که با
StartupTimingMetric ضبط شده است نشان میدهد، سنجههای مهم دیگری نیز وجود دارد که ارزش بررسی دارند،
مانند FrameTimingMetric. برای اطلاعات بیشتر درباره همه انواع سنجهها، به ضبط سنجههای Macrobenchmark مراجعه کنید.
زمان تا نمایش کامل
مثال قبلی زمان لازم برای نمایش اولیه (TTID) را اندازهگیری میکند که مدتزمان لازم برای تولید اولین قاب توسط برنامه است. بااینحال، این لزوماً نشاندهنده زمانی نیست که کاربر میتواند تعامل با برنامه شما را شروع کند. سنجه زمان نمایش کامل (TTFD) برای اندازهگیری و بهینهسازی مسیرهای کد لازم برای داشتن وضعیت برنامه کاملاً قابلاستفاده مفیدتر است.
توصیه میکنیم برای هر دو TTID و TTFD بهینهسازی کنید، زیرا هر دو مهم هستند. TTID پایین به کاربر کمک میکند ببیند که برنامه واقعاً درحال راهاندازی است. کوتاه نگه داشتن TTFD برای کمک به اطمینان از اینکه کاربر میتواند بهسرعت با برنامه تعامل داشته باشد مهم است.
برای راهبردهای گزارشدهی هنگام ترسیم کامل میانای کاربر برنامه، به بهبود دقت زمانبندی راهاندازی مراجعه کنید.
توصیهشده برای شما
- توجه: وقتی جاوا اسکریپت خاموش باشد، نوشتار پیوند نمایش داده میشود
- [Write a Macrobenchmark][11]
- [ضبط سنجههای Macrobenchmark][12]
- نوشتن آزمایشهای خودکار با UI Automator
- [App startup analysis and optimization {:#app-startup-analysis-optimization}][14]