optimizing app startup time - apple developer · optimizing app startup time nick kledzik dyld...

202
© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. Linkers, loaders, and you Developer Tools #WWDC16 Session 406 Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary

Upload: others

Post on 26-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

Linkers, loaders, and you

Developer Tools #WWDC16

Session 406

Optimizing App Startup Time

Nick Kledzik Dyld ArchitectLouis Gerbarg Dyld Visionary

Page 2: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Audience

Page 3: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Audience

Working on app that launches too slow

Page 4: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Audience

Working on app that launches too slow

Want to keep app launching quickly

Page 5: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Audience

Working on app that launches too slow

Want to keep app launching quickly

Like to learn about OS

Page 6: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

What You Will Learn

Page 7: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

What You Will Learn

Theory• Everything that happens before main()• Mach-O format• Virtual Memory basics• How Mach-O binaries are loaded and prepared

Page 8: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

What You Will Learn

Theory• Everything that happens before main()• Mach-O format• Virtual Memory basics• How Mach-O binaries are loaded and prepared

Practical• How to measure• Optimizing start up time

Page 9: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O and Virtual Memory

Crash Course:

Page 10: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Terminology

File Types:

Page 11: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Terminology

File Types:• Executable—Main binary for application

Page 12: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Terminology

File Types:• Executable—Main binary for application• Dylib—Dynamic library (aka DSO or DLL)

Page 13: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Terminology

File Types:• Executable—Main binary for application• Dylib—Dynamic library (aka DSO or DLL)• Bundle—Dylib that cannot be linked, only dlopen(), e.g. plug-ins

Page 14: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Terminology

File Types:• Executable—Main binary for application• Dylib—Dynamic library (aka DSO or DLL)• Bundle—Dylib that cannot be linked, only dlopen(), e.g. plug-ins

Image—An executable, dylib, or bundle

Page 15: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Terminology

File Types:• Executable—Main binary for application• Dylib—Dynamic library (aka DSO or DLL)• Bundle—Dylib that cannot be linked, only dlopen(), e.g. plug-ins

Image—An executable, dylib, or bundleFramework—Dylib with directory for resources and headers

Page 16: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

File divided into segments • Uppercase names

__TEXT

__DATA

__LINKEDIT

Page 17: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

File divided into segments • Uppercase names

All segments are multiples of page size• 16KB on arm64• 4KB elsewhere

__TEXT

__DATA

__LINKEDIT

Page 18: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

File divided into segments • Uppercase names

All segments are multiples of page size• 16KB on arm64• 4KB elsewhere

__TEXT

__DATA

__LINKEDIT

Page 19: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

Sections are a subrange of a segment • Lowercase names

__TEXT

__DATA

__LINKEDIT

__cstring

__text

__stubs __const

__data

__const

Page 20: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

Sections are a subrange of a segment • Lowercase names

__TEXT

__DATA

__LINKEDIT

Page 21: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

Sections are a subrange of a segment • Lowercase names

Common segments:__TEXT

__DATA

__LINKEDIT

Page 22: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

Sections are a subrange of a segment • Lowercase names

Common segments:• __TEXT has header, code, and

read-only constants

__TEXT

__DATA

__LINKEDIT

Page 23: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

Sections are a subrange of a segment • Lowercase names

Common segments:• __TEXT has header, code, and

read-only constants• __DATA has all read-write content:

globals, static variables, etc

__TEXT

__DATA

__LINKEDIT

Page 24: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Image File

Sections are a subrange of a segment • Lowercase names

Common segments:• __TEXT has header, code, and

read-only constants• __DATA has all read-write content:

globals, static variables, etc• __LINKEDIT has "meta data” about

how to load the program

__TEXT

__DATA

__LINKEDIT

Page 25: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Universal Files

__TEXT

__DATA

__LINKEDIT

arm64

Page 26: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Universal Files

__TEXT

__DATA

__LINKEDIT

arm64__TEXT

__DATA

__LINKEDIT

armv7s

Page 27: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Mach-O Universal Files

Fat Header• One page in size• Lists architectures and offsets

Tools and runtimes support fat mach-o files

__TEXT

__DATA

__LINKEDIT

arm64

__TEXT

__DATA

__LINKEDIT

armv7s

Fat Header

Page 28: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirection

Page 29: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)

Page 30: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:

Page 31: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault

Page 32: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes

Page 33: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes• File backed pages

Page 34: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes• File backed pages

- mmap()

Page 35: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes• File backed pages

- mmap()

- lazy reading

Page 36: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes• File backed pages

- mmap()

- lazy reading• Copy-On-Write (COW)

Page 37: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes• File backed pages

- mmap()

- lazy reading• Copy-On-Write (COW)• Dirty vs. clean pages

Page 38: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Virtual MemoryVirtual Memory is a level of indirectionMaps per-process addresses to physical RAM (page granularity)Features:• Page fault• Same RAM page appears in multiple processes• File backed pages

- mmap()

- lazy reading• Copy-On-Write (COW)• Dirty vs. clean pages• Permissions: rwx

Page 39: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

Page 40: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

Page 41: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

Page 42: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

RAM 3

Page 43: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

RAM 3

Page 44: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

Address Space

Process 2

RAM 3

ZeroFill

ZeroFill

ZeroFill

Page 45: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

RAM 1

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

Address Space

Process 2

RAM 3

ZeroFill

ZeroFill

ZeroFill

Page 46: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

RAM 2

RAM 1

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

Address Space

Process 2

RAM 3

ZeroFill

ZeroFill

ZeroFill

Page 47: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

RAM 2

RAM 1

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

Address Space

Process 2

RAM 3 RAM 4

ZeroFill

ZeroFill

ZeroFill

Page 48: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

RAM 2

RAM 1

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

RAM 2

Address Space

Process 2

RAM 3 RAM 4

ZeroFill

ZeroFill

ZeroFill

Page 49: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

RAM 1

__LINKEDIT (r—)

Mach-O Image Loading

__DATA (rw-)

Mach-O Dylib

Address Space

Process 1

ZeroFill

ZeroFill

ZeroFill

__TEXT (r-x)

RAM 1

Address Space

Process 2

RAM 3 RAM 4

ZeroFill

ZeroFill

ZeroFill

Page 50: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Security

ASLR• Address Space Layout Randomization• Images load at random address

Page 51: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Security

ASLR• Address Space Layout Randomization• Images load at random address

Code Signing• Content of each page is hashed• Hash is verified on page-in

Page 52: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

exec() to main()

Page 53: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Your App

exec()

Kernel maps your application into new address spaceStart of your app is random

0x000000

0x???000

Page 54: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

exec()

Kernel maps your application into new address spaceStart of your app is randomLow memory is marked inaccessible• 4KB+ for 32-bit process• 4GB+ for 64-bit processes• Catches NULL pointer usage• Catches pointer truncation errors

0x000000

0x???000

Page 55: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

What About Dylibs?

PAGEZERO

Your App

0x000000

0x???000

0x???000

Page 56: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

What About Dylibs?

Kernel loads helper program• Dyld (dynamic loader)• Executions starts in dyld

PAGEZERO

Your App

0x000000

Dyld

0x???000

0x???000

Page 57: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

What About Dylibs?

Kernel loads helper program• Dyld (dynamic loader)• Executions starts in dyld

Dyld runs in-process• Loads dependent dylibs• Has same permissions as app

PAGEZERO

Your App

0x000000

Dyld

0x???000

0x???000

Page 58: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Load dylibs Rebase Bind ObjC Initializers

Dyld Steps

Load dylibs Rebase Bind ObjC Initializers

Page 59: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Load dylibs Rebase Bind ObjC Initializers

Dyld Steps

Map all dependent dylibs, recurseRebase all imagesBind all imagesObjC prepare imagesRun initializers

Load dylibs Rebase Bind ObjC Initializers

Page 60: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Loading Dylibs

Parse list of dependent dylibs

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT (r—)

__DATA (rw-)

__TEXT (r-x)mmap(r-x)

mmap(rw-)

mmap(r--)

Page 61: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Loading Dylibs

Parse list of dependent dylibsFind requested mach-o file

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT (r—)

__DATA (rw-)

__TEXT (r-x)mmap(r-x)

mmap(rw-)

mmap(r--)

Page 62: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Loading Dylibs

Parse list of dependent dylibsFind requested mach-o fileOpen and read start of file

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT (r—)

__DATA (rw-)

__TEXT (r-x)mmap(r-x)

mmap(rw-)

mmap(r--)

Page 63: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Loading Dylibs

Parse list of dependent dylibsFind requested mach-o fileOpen and read start of fileValidate mach-o

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT (r—)

__DATA (rw-)

__TEXT (r-x)mmap(r-x)

mmap(rw-)

mmap(r--)

Page 64: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Loading Dylibs

Parse list of dependent dylibsFind requested mach-o fileOpen and read start of fileValidate mach-oRegister code signature

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT (r—)

__DATA (rw-)

__TEXT (r-x)mmap(r-x)

mmap(rw-)

mmap(r--)

Page 65: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Loading Dylibs

Parse list of dependent dylibsFind requested mach-o fileOpen and read start of fileValidate mach-oRegister code signatureCall mmap() for each segment

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT (r—)

__DATA (rw-)

__TEXT (r-x)mmap(r-x)

mmap(rw-)

mmap(r--)

Page 66: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylib

Recursive Loading

All your app's direct dependents are loaded

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 67: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibs

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 68: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibsRinse and repeat

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 69: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylibD.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibsRinse and repeat

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 70: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylibD.dylibE.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibsRinse and repeat

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 71: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylibD.dylibE.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibsRinse and repeatApps typically load 100 to 400 dylibs!

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 72: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylibD.dylibE.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibsRinse and repeatApps typically load 100 to 400 dylibs!• Most are OS dylibs

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 73: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

PAGEZERO

Your App

dyldA.dylibB.dylibC.dylibD.dylibE.dylib

Recursive Loading

All your app's direct dependents are loadedPlus any dylib's needed by those dylibsRinse and repeatApps typically load 100 to 400 dylibs!• Most are OS dylibs• We’ve optimized loading of OS dylibs

Load dylibs Rebase Bind ObjC Initializers

0x000000

Page 74: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Fix-ups

Code signing means instructions cannot be altered

Load dylibs Rebase Bind ObjC Initializers

Page 75: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Fix-ups

Code signing means instructions cannot be alteredModern code-gen is dynamic PIC (Position Independent Code)

Load dylibs Rebase Bind ObjC Initializers

Page 76: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Fix-ups

Code signing means instructions cannot be alteredModern code-gen is dynamic PIC (Position Independent Code)• Code can run loaded at any address and is never altered

Load dylibs Rebase Bind ObjC Initializers

Page 77: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Fix-ups

Code signing means instructions cannot be alteredModern code-gen is dynamic PIC (Position Independent Code)• Code can run loaded at any address and is never altered• Instead, all fix ups are in __DATA

Load dylibs Rebase Bind ObjC Initializers

Page 78: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__DATA

Rebasing and Binding

Rebasing: Adjusting pointers to within an image

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__TEXT

Page 79: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

__DATA

Rebasing and Binding

Rebasing: Adjusting pointers to within an imageBinding: Setting pointers to outside image

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__TEXT

_malloc

_free

Page 80: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

[~]> xcrun dyldinfo -rebase -bind -lazy_bind myapp.app/myapp rebase information: segment section address type __DATA __const 0x10000C1A0 pointer __DATA __const 0x10000C1C0 pointer __DATA __const 0x10000C1E0 pointer __DATA __const 0x10000C210 pointer … bind information: segment section address type add dylib symbol __DATA __objc_classrefs 0x10000D1E8 pointer 0 CoreFoundation _OBJC_CLASS_$_NSObject __DATA __data 0x10000D4D0 pointer 0 CoreFoundation _OBJC_METACLASS_$_NSObject __DATA __data 0x10000D558 pointer 0 CoreFoundation _OBJC_METACLASS_$_NSObject __DATA __got 0x10000C018 pointer 0 libswiftCore __TMSS … lazy binding information: segment section address index dylib symbol __DATA __la_symbol_ptr 0x10000C0A8 0x0000 libSystem __Block_copy __DATA __la_symbol_ptr 0x10000C0B0 0x0014 libSystem __Block_release __DATA __la_symbol_ptr 0x10000C0B8 0x002B libSystem _memcpy …

Page 81: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebasing

Rebasing is adding a "slide" value to each internal pointer

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

Page 82: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebasing

Rebasing is adding a "slide" value to each internal pointer Slide = actual_address - preferred_address

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

Page 83: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebasing

Rebasing is adding a "slide" value to each internal pointer Slide = actual_address - preferred_addressLocation of rebase locations is encoded in LINKEDIT

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

Page 84: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebasing

Rebasing is adding a "slide" value to each internal pointer Slide = actual_address - preferred_addressLocation of rebase locations is encoded in LINKEDITPages-in and COW page

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

Page 85: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebasing

Rebasing is adding a "slide" value to each internal pointer Slide = actual_address - preferred_addressLocation of rebase locations is encoded in LINKEDITPages-in and COW pageRebasing is done in address order, so kernel starts prefetching

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

Page 86: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Binding

All references to something in another dylib are symbolic

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

_malloc

Page 87: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Binding

All references to something in another dylib are symbolicDyld needs to find symbol name

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

_malloc

Page 88: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Binding

All references to something in another dylib are symbolicDyld needs to find symbol nameMore computational than rebasing

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

_malloc

Page 89: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Binding

All references to something in another dylib are symbolicDyld needs to find symbol nameMore computational than rebasingRarely page faults

Load dylibs Rebase Bind ObjC Initializers

__LINKEDIT

__DATA

__TEXT

_malloc

Page 90: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Notify ObjC Runtime

Most ObjC set up done via rebasing and binding

Load dylibs Rebase Bind ObjC Initializers

Page 91: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Notify ObjC Runtime

Most ObjC set up done via rebasing and bindingAll ObjC class definitions are registered

Load dylibs Rebase Bind ObjC Initializers

Page 92: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Notify ObjC Runtime

Most ObjC set up done via rebasing and bindingAll ObjC class definitions are registeredNon-fragile ivars offsets updated

Load dylibs Rebase Bind ObjC Initializers

Page 93: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Notify ObjC Runtime

Most ObjC set up done via rebasing and bindingAll ObjC class definitions are registeredNon-fragile ivars offsets updatedCategories are inserted into method lists

Load dylibs Rebase Bind ObjC Initializers

Page 94: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Notify ObjC Runtime

Most ObjC set up done via rebasing and bindingAll ObjC class definitions are registeredNon-fragile ivars offsets updatedCategories are inserted into method listsSelectors are uniqued

Load dylibs Rebase Bind ObjC Initializers

Page 95: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Initializers

C++ generates initializer for statically allocated objects

Load dylibs Rebase Bind ObjC Initializers

Page 96: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Initializers

C++ generates initializer for statically allocated objectsObjC +load methods

Load dylibs Rebase Bind ObjC Initializers

Page 97: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Initializers

C++ generates initializer for statically allocated objectsObjC +load methodsRun "bottom up" so each initializer can call dylibs below it

Load dylibs Rebase Bind ObjC Initializers

Page 98: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Initializers

C++ generates initializer for statically allocated objectsObjC +load methodsRun "bottom up" so each initializer can call dylibs below itLastly, Dyld calls main() in executable

Load dylibs Rebase Bind ObjC Initializers

Page 99: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Pre-main() Summary

Dyld is a helper program

Page 100: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Pre-main() Summary

Dyld is a helper program • Loads all dependent dylibs

Page 101: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Pre-main() Summary

Dyld is a helper program • Loads all dependent dylibs• Fixes up all pointers in DATA pages

Page 102: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Pre-main() Summary

Dyld is a helper program • Loads all dependent dylibs• Fixes up all pointers in DATA pages• Runs all initializers

Page 103: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Putting Theory into Practice

Louis Gerbarg

Page 104: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

OverviewImproving Launch Times

How fast?

Page 105: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

OverviewImproving Launch Times

How fast?How to measure?

Page 106: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

OverviewImproving Launch Times

How fast?How to measure?Why is launch slow?

Page 107: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

OverviewImproving Launch Times

How fast?How to measure?Why is launch slow?What can you do?

Page 108: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Spoiler

Page 109: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Do Less Stuff

Spoiler

Page 110: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

GoalsImproving Launch Times

Launch faster than animation

Page 111: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

GoalsImproving Launch Times

Launch faster than animation• Duration varies on devices

Page 112: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

GoalsImproving Launch Times

Launch faster than animation• Duration varies on devices• 400ms is a good target

Page 113: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

GoalsImproving Launch Times

Launch faster than animation• Duration varies on devices• 400ms is a good target

Don’t ever take longer than 20 seconds

Page 114: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

GoalsImproving Launch Times

Launch faster than animation• Duration varies on devices• 400ms is a good target

Don’t ever take longer than 20 seconds• App will be killed

Page 115: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

GoalsImproving Launch Times

Launch faster than animation• Duration varies on devices• 400ms is a good target

Don’t ever take longer than 20 seconds• App will be killed

Test on the slowest supported device

Page 116: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Launch recapImproving Launch Times

Page 117: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Launch recapImproving Launch Times

Parse imagesMap imagesRebase imagesBind imagesRun image initializersCall main()

Page 118: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Launch recapImproving Launch Times

Parse imagesMap imagesRebase imagesBind imagesRun image initializersCall main()Call UIApplicationMain()

Page 119: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Launch recapImproving Launch Times

Parse imagesMap imagesRebase imagesBind imagesRun image initializersCall main()Call UIApplicationMain()Call applicationWillFinishLaunching

Page 120: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch

Page 121: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch• App and data already in memory

Page 122: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch• App and data already in memory

Cold launch

Page 123: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch• App and data already in memory

Cold launch• App is not in kernel buffer cache

Page 124: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch• App and data already in memory

Cold launch• App is not in kernel buffer cache

Warm and cold launch times will be different

Page 125: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch• App and data already in memory

Cold launch• App is not in kernel buffer cache

Warm and cold launch times will be different• Cold launch times are important

Page 126: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Warm vs. cold launchImproving Launch Times

Warm launch• App and data already in memory

Cold launch• App is not in kernel buffer cache

Warm and cold launch times will be different• Cold launch times are important• Measure cold launch by rebooting

Page 127: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficult

Page 128: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements

Page 129: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

Page 130: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

- Available on shipping OSes

Page 131: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

- Available on shipping OSes- Significantly enhanced in new OSes

NEW

Page 132: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

- Available on shipping OSes- Significantly enhanced in new OSes- Available in seed 2

NEW

Page 133: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

- Available on shipping OSes- Significantly enhanced in new OSes- Available in seed 2

Debugger pauses every dylib load

NEW

Page 134: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

- Available on shipping OSes- Significantly enhanced in new OSes- Available in seed 2

Debugger pauses every dylib load• Dyld subtracts out debugger time

NEW

Page 135: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

MeasurementsImproving Launch Times

Measuring before main() is difficultDyld has built in measurements• DYLD_PRINT_STATISTICS environment variable

- Available on shipping OSes- Significantly enhanced in new OSes- Available in seed 2

Debugger pauses every dylib load• Dyld subtracts out debugger time• Console times less than wall clock

NEW

Page 136: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

DYLD_PRINT_STATISTICSImproving Launch Times

Page 137: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

DYLD_PRINT_STATISTICSImproving Launch Times

Page 138: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.6 seconds (100.0%) dylib loading time: 240.09 milliseconds (2.2%) rebase/binding time: 351.29 milliseconds (3.3%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (94.2%)

App Launch Time

Page 139: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.6 seconds (100.0%) dylib loading time: 240.09 milliseconds (2.2%) rebase/binding time: 351.29 milliseconds (3.3%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (94.2%)

App Launch Time

Page 140: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.6 seconds (100.0%) dylib loading time: 240.09 milliseconds (2.2%) rebase/binding time: 351.29 milliseconds (3.3%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (94.2%)

App Launch Time

Page 141: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Embedded dylibs are expensive

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 142: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Embedded dylibs are expensiveUse fewer dylibs

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 143: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Embedded dylibs are expensiveUse fewer dylibs• Merge existing dylibs

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 144: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Embedded dylibs are expensiveUse fewer dylibs• Merge existing dylibs• Use static archives

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 145: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Embedded dylibs are expensiveUse fewer dylibs• Merge existing dylibs• Use static archives

Lazy load, but…

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 146: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ertwert

Embedded dylibs are expensiveUse fewer dylibs• Merge existing dylibs• Use static archives

Lazy load, but…• dlopen() can cause issues• Actually more work overall

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 147: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ertwert

Embedded dylibs are expensiveUse fewer dylibs• Merge existing dylibs• Use static archives

Lazy load, but…• dlopen() can cause issues• Actually more work overall

Dylib Loading

App Launch Time

dylib loading time: 240.09 milliseconds (2.2%)

Page 148: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ertwert

Embedded dylibs are expensiveUse fewer dylibs• Merge existing dylibs• Use static archives

Lazy load, but…• dlopen() can cause issues• Actually more work overall

Dylib Loading

App Launch Time

dylib loading time: 21.75 milliseconds (0.2%)

Page 149: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.4 seconds (100.0%) dylib loading time: 21.75 milliseconds (0.2%) rebase/binding time: 351.29 milliseconds (3.3%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (96.1%)

App Launch Time

Page 150: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.4 seconds (100.0%) dylib loading time: 21.75 milliseconds (0.2%) rebase/binding time: 351.29 milliseconds (3.3%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (96.1%)

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 151: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.4 seconds (100.0%) dylib loading time: 21.75 milliseconds (0.2%) rebase/binding time: 351.29 milliseconds (3.3%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (96.1%)

rebase/binding time: 351.29 milliseconds (3.3%)

App Launch Time

Page 152: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 153: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointers

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 154: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointersReduce Objective C metadata• Classes, selectors, and categories

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 155: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointersReduce Objective C metadata• Classes, selectors, and categories

Reduce C++ virtual

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 156: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointersReduce Objective C metadata• Classes, selectors, and categories

Reduce C++ virtualUse Swift structs

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 157: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointersReduce Objective C metadata• Classes, selectors, and categories

Reduce C++ virtualUse Swift structsExamine machine generated code• Use offsets instead of pointers• Mark read only

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 158: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointersReduce Objective C metadata• Classes, selectors, and categories

Reduce C++ virtualUse Swift structsExamine machine generated code• Use offsets instead of pointers• Mark read only

App Launch Time

rebase/binding time: 351.29 milliseconds (3.3%)

Page 159: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Rebase/Binding

Reduce __DATA pointersReduce Objective C metadata• Classes, selectors, and categories

Reduce C++ virtualUse Swift structsExamine machine generated code• Use offsets instead of pointers• Mark read only

App Launch Time

rebase/binding time: 19.33 milliseconds (0.2%)

Page 160: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.1 seconds (100.0%) dylib loading time: 21.75 milliseconds (0.2%) rebase/binding time: 19.33 milliseconds (0.2%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (99.4%)

slowest intializers : MyAwesomeApp : 10.0 seconds (99.3%)

App Launch Time

Page 161: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.1 seconds (100.0%) dylib loading time: 21.75 milliseconds (0.2%) rebase/binding time: 19.33 milliseconds (0.2%) ObjC setup time: 11.83 milliseconds (0.1%) initializer time: 10 seconds (99.4%)

slowest intializers : MyAwesomeApp : 10.0 seconds (99.3%)

ObjC setup time: 11.83 milliseconds (0.1%)

App Launch Time

Page 162: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.1 seconds (100.0%) dylib loading time: 21.75 milliseconds (0.2%) rebase/binding time: 19.33 milliseconds (0.2%)

initializer time: 10 seconds (99.4%)

slowest intializers : MyAwesomeApp : 10.0 seconds (99.3%)

App Launch Time

ObjC setup time: 11.83 milliseconds (0.1%)

Page 163: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ObjC setup time: 11.83 milliseconds (0.1%)

ObjC Setup

Class registration

App Launch Time

Page 164: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ObjC setup time: 11.83 milliseconds (0.1%)

ObjC Setup

Class registrationNon-fragile ivars offsets updated

App Launch Time

Page 165: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ObjC setup time: 11.83 milliseconds (0.1%)

ObjC Setup

Class registrationNon-fragile ivars offsets updatedCategory registration

App Launch Time

Page 166: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ObjC setup time: 11.83 milliseconds (0.1%)

ObjC Setup

Class registrationNon-fragile ivars offsets updatedCategory registrationSelector uniquing

App Launch Time

Page 167: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ObjC setup time: 4.60 milliseconds (0.1%)

ObjC Setup

Class registrationNon-fragile ivars offsets updatedCategory registrationSelector uniquing

App Launch Time

Page 168: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.6 seconds (100.0%) dylib loading time: 21.75 milliseconds (2.2%) rebase/binding time: 19.33 milliseconds (3.3%)

initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (99.3%)

ObjC setup time: 4.60 milliseconds (0.1%)

App Launch Time

Page 169: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Total pre-main time: 10.6 seconds (100.0%) dylib loading time: 21.75 milliseconds (2.2%) rebase/binding time: 19.33 milliseconds (3.3%)

initializer time: 10 seconds (94.3%)

slowest intializers : MyAwesomeApp : 10.0 seconds (99.3%)

ObjC setup time: 4.60 milliseconds (0.1%) initializer time: 10 seconds (99.4%)

App Launch Time

Page 170: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

ExplicitInitializers

App Launch Time

initializer time: 10 seconds (99.4%)

Page 171: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

ExplicitInitializers

ObjC +load methods

App Launch Time

initializer time: 10 seconds (99.4%)

Page 172: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

sdfgsdfg

ExplicitInitializers

ObjC +load methods• Replace with +initiailize

App Launch Time

initializer time: 10 seconds (99.4%)

Page 173: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

sdfgsdfg

ExplicitInitializers

ObjC +load methods• Replace with +initiailize

C/C++ __attribute__((constructor))

App Launch Time

initializer time: 10 seconds (99.4%)

Page 174: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

sdfgsdfg

ExplicitInitializers

ObjC +load methods• Replace with +initiailize

C/C++ __attribute__((constructor))Replace with call site initializers

App Launch Time

initializer time: 10 seconds (99.4%)

Page 175: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

sdfgsdfg

dsfgsdfgsed

ExplicitInitializers

ObjC +load methods• Replace with +initiailize

C/C++ __attribute__((constructor))Replace with call site initializers• dispatch_once()

App Launch Time

initializer time: 10 seconds (99.4%)

Page 176: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

sdfgsdfg

dsfgsdfgsed

3452342

ExplicitInitializers

ObjC +load methods• Replace with +initiailize

C/C++ __attribute__((constructor))Replace with call site initializers• dispatch_once()• pthread_once()

App Launch Time

initializer time: 10 seconds (99.4%)

Page 177: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

sdfgsd

sdfgsdfg

dsfgsdfgsed

3452342

345rwefsdfsd

ExplicitInitializers

ObjC +load methods• Replace with +initiailize

C/C++ __attribute__((constructor))Replace with call site initializers• dispatch_once()• pthread_once()• std::once()

App Launch Time

initializer time: 10 seconds (99.4%)

Page 178: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

SDFASDFASDF

ImplicitInitializers

App Launch Time

initializer time: 10 seconds (99.4%)

Page 179: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors

App Launch Time

initializer time: 10 seconds (99.4%)

Page 180: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers

App Launch Time

initializer time: 10 seconds (99.4%)

Page 181: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)

App Launch Time

initializer time: 10 seconds (99.4%)

Page 182: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors

App Launch Time

initializer time: 10 seconds (99.4%)

Page 183: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors• Rewrite in Swift

App Launch Time

initializer time: 10 seconds (99.4%)

Page 184: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

168121ASDF

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors• Rewrite in Swift

Do not call dlopen() in initializers

App Launch Time

initializer time: 10 seconds (99.4%)

Page 185: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

168121ASDF

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors• Rewrite in Swift

Do not call dlopen() in initializersDo not create threads in initializers

App Launch Time

initializer time: 10 seconds (99.4%)

Page 186: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

168121ASDF

ASEFWE23

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors• Rewrite in Swift

Do not call dlopen() in initializersDo not create threads in initializers

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

struct Pause {

Pause(uint32_t i) {

sleep(i);

}

};

Pause onLaunch(10);

App Launch Time

initializer time: 10 seconds (99.4%)

Page 187: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

168121ASDF

ASEFWE23

SDFASDFASDF

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors• Rewrite in Swift

Do not call dlopen() in initializersDo not create threads in initializers

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

struct Pause {

Pause(uint32_t i) {

sleep(i);

}

};

//Pause onLaunch(10);

App Launch Time

initializer time: 3.96 milliseconds (7.9%)

Page 188: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

168121ASDF

ASEFWE23

ImplicitInitializers

C++ statics with non-trivial constructors• Replace with call site initializers• Only set simple values (PODs)• -Wglobal-constructors• Rewrite in Swift

Do not call dlopen() in initializersDo not create threads in initializers

App Launch Time

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

struct Pause {

Pause(uint32_t i) {

sleep(i);

}

};

//Pause onLaunch(10);

initializer time: 3.96 milliseconds (7.9%)

Page 189: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

App Launch Time

Total pre-main time: 49.83 milliseconds (100.0%)

initializer time: 3.96 milliseconds (7.9%)

dylib loading time: 21.75 milliseconds (43.6%) rebase/binding time: 19.33 milliseconds (38.7%)

slowest intializers : libSystem.B.dylib : 2.80 milliseconds (5.6%)

ObjC setup time: 4.60 milliseconds (9.2%)

Page 190: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

App Launch Time

Total pre-main time: 49.83 milliseconds (100.0%)

initializer time: 3.96 milliseconds (7.9%)

dylib loading time: 21.75 milliseconds (43.6%) rebase/binding time: 19.33 milliseconds (38.7%)

slowest intializers : libSystem.B.dylib : 2.80 milliseconds (5.6%)

ObjC setup time: 4.60 milliseconds (9.2%)

dylib loading time: 21.75 milliseconds (43.6%) rebase/binding time: 19.33 milliseconds (38.7%)

slowest intializers : libSystem.B.dylib : 2.80 milliseconds (5.6%)

ObjC setup time: 4.60 milliseconds (9.2%)

Total pre-main time: 49.83 milliseconds (100.0%)

Page 191: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICS

Page 192: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by

Page 193: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by• Embedding fewer dylibs

Page 194: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by• Embedding fewer dylibs• Consolidating Objective-C classes

Page 195: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by• Embedding fewer dylibs• Consolidating Objective-C classes • Eliminating static initializers

Page 196: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by• Embedding fewer dylibs• Consolidating Objective-C classes • Eliminating static initializers

Use more Swift

Page 197: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by• Embedding fewer dylibs• Consolidating Objective-C classes • Eliminating static initializers

Use more Swiftdlopen() is discouraged

Page 198: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

TL;DR

Measure launch times with DYLD_PRINT_STATISTICSReduce launch times by• Embedding fewer dylibs• Consolidating Objective-C classes • Eliminating static initializers

Use more Swiftdlopen() is discouraged• Subtle performance and deadlock issues

Page 199: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

More Information

https://developer.apple.com/wwdc16/406

Page 200: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Related Sessions

Optimizing I/O for Performance and Battery Life Nob Hill Friday 11:00AM

Using Time Profiler in Instruments Nob Hill Friday 3:00PM

iOS App Performance Responsiveness WWDC 2012

Page 201: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches

Labs

Compiler, Objective-C, and C++ Lab Developer Tools Lab B Wednesday 12:00PM

Compiler, Objective-C, and C++ Lab Developer Tools Lab B Wednesday 1:30PM

Compiler, Optimizing App Startup Time Lab Developer Tools Lab B Thursday 1:30PM

Page 202: Optimizing App Startup Time - Apple Developer · Optimizing App Startup Time Nick Kledzik Dyld Architect Louis Gerbarg Dyld Visionary. Audience. Audience Working on app that launches