WWDC 2019 Optimizing App Launch

2019-07-15  本文已影响0人  Jerrydu96

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 UIApplicationDelegateinitialization

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:

  1. Minimize
    Defer work unrelated to first frame
    Move blocking work off main thread
    Reduce memory usage
  2. 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
  1. 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

上一篇 下一篇

猜你喜欢

热点阅读