There are some core elements of software that Apple believes are important enough to require dedicated teams to keep them in focus. Privacy is one. They're involved in the design of new features from the very beginning. Security is another. Nothing should ship that compromises the integrity of the system. Accessibility, because the company rightly believes it isn't a nice-to-have but a must-have. And performance, who constantly seek zero regression not just for new features and devices but for every feature and device currently being shipped.
Members of the performance team, for a long time, have carried older devices running upcoming operating systems to help make sure the new bits worked well on old atoms. Individuals on the software engineering teams have done likewise. It's not just part of the job, they know their family members and friends have older devices — in some cases very old devices — and not only do they want to ensure the best experience possible, they know that, come the fall, they'll get an earful about it if they don't.
But, most years, getting version x.0 launched on time is a sprint to the finish line. Everyone does their best but, inevitably, deal breakers and showstoppers begin to swallow more and more time and attention, and reality sets into what you can do now vs. what you'll have to leave for x.1, x.2, or even x.3 or x.4.
This year, though, performance wasn't just part of the job, it was the headline feature of iOS 12. And that meant everyone, from the executives and managers setting the priorities to the creators and directly responsible individuals who first built or now own the specific frameworks, were invested in devoting all of their resources into making iPhone and iPad faster and more responsive not just on current generation, 2017 hardware, but on up to five generations going back to 2013.
You are what you update
While, by virtue of its modular model, it takes Google months, sometimes a year or more, to get the latest version of Android onto a single-digit percentage of the existing devices that run it, and many of those devices are lucky if they ever see any updates at all, let alone a year, two, or three down the line, Apple makes it a point of pride that every iOS device, on every carrier, in every part of the world, all gets the same update at the same time, and keeps getting updates multiple times a year, going back generations.
With iOS 12, Apple is supporting the same set of iPhones, iPads, and iPod touch it supported with iOS 11: Everything with a 64-bit processor, which is everything since late 2013.
Apple believes those updates are part of the value of the products it sells. It may not be any more immediately tangible than the free classes offered at Apple Stores, but it hopes when prices are compared, it's not just the product people see — it's the commitment to supporting that product and actively helping you get the most out of it.
It makes Apple's software and services a better fit for its hardware, which typically stays active for generations — not just years after it was bought, but through successive owners, as it's sold or handed down.
It might seem like a poor business decision on Apple's part. After all, people happy with their old devices aren't as likely to upgrade to new ones. I think Apple sees it as an investment, though. People happy with their old devices are more likely to buy from Apple again when they finally do decide to upgrade to a new one. They're also more likely to convince friends and family, some of whom have creaky, cracking, nearly un-chargeable, almost always un-updatable, devices from other vendors to upgrade to Apple next as well.
It's an optimistic model, but when it's both the best thing and the right thing to do, you do it.
For a while, though, some of that added value and optimism has been tarnished. People still got the updates but some started to see them not as great new features but as increased load on already straining hardware.
Late last year that all came to a head with the #iPhoneSlow controversy, and Apple's decision to gate performance in order to preserve battery life and prevent unexpected shutdowns.
it's easy to say Apple is damned if it does and damned if it doesn't: Claims that Apple adds new features to overload old devices to push upgrades are matched by equal and opposite claims that Apple witholds new features to inflate demand for upgrades. But it's Apple's job to navigate those treacherous, often ludicrous waters, and find the absolute best balance for as many customers as possible.
Enter iOS 12.
From #iPhoneSlow to #iPhoneGO!
There are never enough engineers. Not even for a company as wealthy as Apple. The number of people capable of working at Apple's level, willing to work in Cupertino, California and everything that entails, will accept the secrecy and industry isolation that comes with the job, and aren't tempted by startups, VCs, IPOs, or less demanding, less restrictive options elsewhere, is always limited in a way money alone can never solve.
Typically, the best and the brightest spend the year working on the big new flagship features or the foundational improvements that will enable subsequent big new flagship features.
This year, Apple had many of them spend a lot of their time improving the performance of existing frameworks and technologies instead. (You could argue, and I'm guessing many did, that this is a foundational improvement that will enable subsequent big new flagship features.)
The results can be found in the numbers Apple gave during the WWDC 2018 keynote:
- Apps launch up to 40% faster.
- Keyboard launches up to 50% faster and remains more responsive.
- Camera launches up to 70% faster.
- Share sheet launches up to 100% faster.
And, impressively, much of this remains true even when an older device is already under load.
Everything old is new-feeling again
Achieving the kind of performance enhancement iOS 12 offers starts with the silicon. Because Apple designs its chipsets in-house, it can build and optimize for exactly what it needs. That includes changing the normal, slow processor ramp up to an almost immediate one. (Think going from something that graphs like a gentle, symmetrical hill to something that looks like the front end of a crashing wave.)
This, for example, helped solve a weird situation where a device under no load would drop frames but, when under slight load, it would not (because, in the latter case, it was already ramped up). And it was done by passing information about what scrolling was happening and when acceleration will be needed from the interface frameworks to the CPU controller. That way, the silicon knows what's about to happen and what's needed to make it happen smoothly.
On the software side, Apple worked to improve scrolling (UITableView, UICollectionView, and similar custom views). On most devices, which operate at 60Hz, there's 16 milliseconds to set up, fill, and draw content into the cells that make up a view before frames start to drop and scrolling is affected. On a 120Hz iPad Pro, just 8 milliseconds.
iOS 10 began to address this with a prefetch API, which could work in the background to prepare views and prevent work having to be done on-demand when resources could already be strained. With iOS 12, Apple removed some edge cases which caused problems like drawing the same frame twice (which is indistinguishable from a dropped frame). In general, iOS 12 is also more intelligent about how it schedules prefetches, avoiding concurrency and handling them serially instead.
Auto Layout, the foundation for size classes, affects all of Apple's multi-size and, for iPad, multi-window displays. It's also been significantly improved in iOS 12. Independent sibling views, for example, used to scale linearly. Now, they scale slight sub-linearly. Dependent sibling views in iOS 11 scaled exponentially. Now, they scale linearly. Same with nested views.
Apple also addressed memory, which directly relates to performance. Previously, when apps made a large memory request, the system had to go find that memory from somewhere — likely other apps. That delayed the current app but also undermined the other apps. (If you later went back to one, it would likely have to reload either partially or completely, which takes time.)
iOS 12 helps address this, for example, with new techniques like Automatic Backing Stores. That means an app can draw a full fidelity Portrait Mode image if it needs to, but if it's only drawing a low fidelity line-art image, it can drop from 64-bits down to 8-bits to significantly reduce the demands on memory.
Apple is also deprecating the old UIWebView API for the more modern WKWebview, which works on both iOS and macOS, and runs in its own process, so even if it crashes, it doesn't take the app down with it.
From zero regression to postive progression
The performance fixes in iOS 12 go deep. Running the beta on older hardware right, I can already see and feel significant improvements at the system level.
Now, some improvements depend on developers adopting Apple's performance recommendations. So, we'll have to wait until the fall, when iOS 12 ships and iOS 12-optimized apps arrive in the App Store along with it, before any final gains can be measured and conclusions drawn.
I'm optimistic though. Not just that iOS 12 will improve the performance of iPhones, iPads, and iPod touch going back to the introduction of 64-bit back in late 2013, but that maintaining that performance isn't just a one-and-done but a key part of Apple's strategy going forward.
After all, the higher you want to go, the better you have to maintain your foundations.