BBMM Technologies
← All articles
6 min readios, performance, launch-time, apple

Reducing App Launch Time on Apple Platforms

By Mykhailo Boichuk · Co-founder & Vice-President

In short

Launch time is the first thing a user feels, and slow launches color everything after. The work that blocks the first usable frame, dynamic library loading, heavy initialization, synchronous disk and network access on the launch path, is the target. The discipline is to measure where launch time actually goes, defer anything not needed to show the first screen, and avoid blocking the main thread before the interface appears.

The first frame sets expectations

Launch is the first interaction a person has with an app each time they open it, and a sluggish launch frames everything that follows as slow. Apple platforms distinguish the work before the first frame from the work to reach a fully interactive state, and the most painful delays are those that keep the screen blank or frozen after the tap. The goal is to reach a meaningful first frame quickly, even if some content finishes loading afterward.

Because launch happens on every open, it is one of the highest-return performance targets. A few hundred milliseconds shaved off launch is felt every single time, unlike a deep feature that is used occasionally.

Find what blocks the launch path

Launch time accumulates from several sources: loading and linking dynamic libraries, running static initializers, constructing the initial interface, and any synchronous work the app insists on doing before showing anything. The first step is always measurement, because intuition about where launch time goes is frequently wrong. Profiling the launch path reveals which of these dominate for a particular app.

  • Measure the launch path before optimizing, since the bottleneck is often surprising.
  • Reduce dynamic library and initializer work that runs before the first frame.
  • Move synchronous disk and network access off the critical launch path.

Defer everything not needed to show the screen

The central technique is deferral. Work that is not required to display the first usable screen should not run before it. Analytics setup, prefetching, building views the user has not navigated to, and similar tasks can happen after the interface is visible and interactive. The user does not need them to be done in order to start, so making the launch wait for them is pure cost.

Blocking the main thread before the first frame is the most direct cause of a frozen launch. Any synchronous work on the launch path, especially disk or network access, should be moved off the main thread or deferred until after the interface appears.

Key takeaways

  • Launch happens on every open, so it is one of the highest-return performance targets.
  • A slow first frame frames the entire session as sluggish.
  • Measure the launch path first, because the real bottleneck is often surprising.
  • Defer work not needed to show the first usable screen until after it appears.
  • Keep synchronous disk and network access off the main thread during launch.

Frequently asked questions

Why prioritize launch time over other performance work?
Launch happens every time the app opens and shapes the perception of everything that follows, so improvements there are felt on every single use.
What typically slows down app launch?
Loading and linking libraries, static initializers, constructing the interface, and synchronous disk or network work that blocks the first frame.
What is the main technique to speed up launch?
Deferral: anything not required to show the first usable screen, such as analytics setup or prefetching, should run after the interface is visible.

References

About the author

Mykhailo Boichuk

Co-founder & Vice-President

Mykhailo is an engineer who builds native applications and the systems behind them. He concentrates on macOS and iOS performance, local-first data architecture, and the synchronization problems that come with offline-capable software.