Why Launch Is Important
First experience with your app should be delightful
Indicative of your codes overall performance
Impacts the system performance and battery
Phases of App Launch
App运行的步骤
System Interface
Runtime Init
UIKit Init
Application Init
Initial Frame Render
Extended
System Interface
DYLD3
Dynamic Linker loads shared libraries and frameworks
Introduces caching of runtime dependencies to improve warm launch
ps: should go to see that
App Startup Time: Past, Present, and Future WWDC 2017
Some steps to optimizing for DYLD3
Avoid linking unused frameworks
Avoid dynamic library loading during launch
Hard link all your dependencies
For libSystem Init
Initializes the interfaces with low level system components
System side work with a fixed cost
Static Runtime Initialization
Steps to do:
Initializes the language runtime
Invokes all class static load methods
Ways to optimizing:
Expose delicate initialization API in frameworks
Reduce impact to launch by avoiding + [Class load]
Use + [Class initialize]
to lazily conduct static initialization
UIKit Initialization
Steps to do:
Instantiates the UIApplication
And UIApplicationDelegate
Begins event processing and integration with the system
Ways to optimizing:
Minimize work in UIApplication
subclass
Minimize work in UIApplicationDelegate
initialization
Application Initialization
Lifecycle Callbacks
Invokes UIApplicationDelegate app lifecycle callbacks
application:willFinishLaunchingWithOptions:
application:didFinishLaunchingWithOptions:
Invokes UIApplicaitonDelegate UI lifecycle callbacks
applicationDidBecomaActive:
Invokes UIScreenDelegate UI lifecycle callbacks for each scene
scene:willConnectToSession:options:
scene:willEnterForeground:
sceneDidBecomeActive:
Ways to optimizing:
Defer unrelated work
share resources between scenes
First Frame Render
Creates, performs layout for, and draws views
Commits and renders first frame
loadView
viewDidLoad
layoutSubviews
Ways to optimizing:
Flatten view hierarchies and lazily load views
Optimize auto layout usage
Extended
Leverage os_signpost to messurework
Measuring Performance Using Logging WWDC 2018
Trading Representativeness for Consistency
Remove sources of variance to produce mode consistent results
May result in launch times that are not representative
Use consistent results to evaluate progress
Test in a Clean and Consistent Environment
Reboot then let system quiesce for 2-3 minutes
Enable Airplane Mode or mock the network
Use unchanging or no iCloud Account
Use release build of your app
Measure warm launches
Measuring Launch with XCTest
Improving Battery Life and Performance WWDC 2019
Use Instruments to profile your launch
Tips and Tricks:
- Minimize
Defer work unrelated to first frame
Move blocking work off main thread
Reduce memory usage - Prioritize
Identify the right QoS for your task
Utilize scheduler optimizations for app launch
Preserve the priority with the right primitives
Modernizing Grand Central Dispatch Usage WWDC 2017
- Optimize
Simplify or limit existing work
Optimize algorithms and data structures
Cache resources and computations
Track Your Launch Over Time
Make performance a development-time priority
Plot it and have a target
Monitor Customer Launches with Xcode Organizer
Adopt MetricKit for More Statistics
Collect custom power and performance metrics
Aggregated results delivered every 24 hours
Summary
Start understanding your launch today
Measure---dong't estimate---performance
Track performance in all phases of development
网友评论