Hermes Performance on iOS

Authors
Jakub Kłobus
Software Engineer
@
Callstack

Hermes is now available on iOS as of React Native 0.64 - the latest version of React Native comes with support for the Hermes engine on iOS. We describe the full process of bringing Hermes to iOS in a series of articles:

While the first two provide detailed information about Hermes and its performance, respectively, the last ones offer practical guidance on Hermes implementation. This article is a high-level overview of Hermes on iOS, including the benchmarks and results of running Hermes in production.

Hermes performance on iOS compared with JavaScriptCore (JSC)

Let’s take a closer look at Hermes performance: should you choose it in favor of JSC on iOS as well? Is it actually faster? What kind of improvements (if any) can you expect? We are going to address all these questions so read on to find out how things are. TL;DR React Native is now really fast. Hermes on iOS made the app start ~40% faster than JSC.

Methodology

We decided to use a Mattermost mobile application as an environment for our profiling. It is an open source React Native mobile application. Thanks to its advanced interactions and extensive functionality, it represents a real world application that we all might be building one day.

On top of that, it was used by Facebook to measure Hermes performance on Android. This will be a good reference to compare the scale of improvements with Android itself.

We measured the following three components:

  1. Time to Interactive (TTI) that describes the time from the cold application start till it becomes ready for user interactions.
  2. Memory that is being used by the React Native application once started.
  3. Size taken by the final application on the disk with the Hermes engine included.

Note: To better visualize the TTI difference, we have a) recorded and included a side-by-side breakdown of an application launching with both Hermes enabled and disabled and b) performed that test on a different set of Apple devices, from iPhone 12 mini, iPhone X to iPhone 6 Plus.

Time to Interactive (TTI)

diagram showing time for the app to become usable

We measured the time for the app to become usable. Everything between pressing the app icon and seeing the first screen rendered was measured multiple times to get the final results. We can see that mobile applications with Hermes launch faster than a regular React Native app on all tested devices.

The difference is least significant on the latest iPhone 12 family that is powered by A14 Bionic. We can see it grows as we run the test suite on older devices. For example, on the iPhone 6 Plus (that I remember buying a brand new not so while ago), it is 2.5s!

If you are not sure whether these numbers make a difference, take a look at the side-by-side video recording we have done on each of these devices. Fun fact, while doing it myself, I have learnt that I am able to notice half a second difference!

iPhone 12 Mini

demo showing Hermes comparison Feed on iPhone 12 Mini
Left side: Hermes, right side: RN without Hermes

iPhone X

demo showing Hermes comparison Feed on iPhone X
Left side: Hermes, right side: RN without Hermes

iPhone 6 Plus

demo showing Hermes comparison Feed on iPhone 6 Plus
Left side: Hermes, right side: RN without Hermes

Memory

Hermes performance on iOS - memory graph

On iPhone 12 with the enabled Hermes engine the average memory usage for the Mattermost application is around 178mb. In an application without Hermes memory, the same actions use around 216mb. Apparently, there is 38mb improvement in memory usage. For such an application - an application that displays loads of data - this is a great change.

Size

Hermes performance on iOS - size graph

On iPhone 12, the application with Hermes engine included was 2 megabytes larger in size overall. That is not a surprise - JSC comes built-in with every iOS version and there is no need to ship it separately. Besides including the Hermes engine itself, we’re also generating a bytecode bundle which contributes to it.

I think this is really good news - 2 megabytes is not much and it will have less of an impact the larger your codebase is.

Conclusion

It’s been really fun playing around with Hermes on iOS with React Native 0.64 and testing it out on Mattermost example. Unless there is something stopping you from upgrading to the latest release, I highly recommend trying it out. The TTI improvements alone are remarkable - your users will definitely enjoy your application launching in a blink of an eye! 

To find out how to compile Hermes and integrate it with React Native, check our two-part Technical Guide. We are positive it will prove useful when playing around with Hermes and when working on a custom engine in React Native.

Find out more

As part of The React Native Show, we released a podcast fully dedicated to Hermes: React Native 0.64 with Hermes for iOS. Check it out to learn more about Hermes on iOS and MacOS from Facebook and Microsoft engineers.

Looking to improve your React Native app performance? Download our Ultimate Guide to React Native Optimization. It describes best practices for optimizing app stability, resource usage, user experience, and maintenance costs. And if you’re looking for experienced developers to help you boost your product’s performance, give our React Native development company a shout. 

Insights

Learn more about Hermes

cover

Dec 18Article

Why You Don’t Have to Minify JavaScript Code in React Native Apps

React Native skips JavaScript minification in production because Hermes handles dead code elimination at the bytecode level. Here’s how and why it works.

cover

Dec 4Podcast

From Static Hermes to Hermes V1: The Road to Default

Nicola Corti (Meta) explains the evolution of Static Hermes into Hermes V1, the performance boosts it ships, and the (experimental) path to making it the new default engine.

cover

Nov 6Live Stream

Hermes V1: What It Is, What It Isn’t, and What’s Next

Łukasz Chludziński, Szymon Chmal, and Matt Hargett unpack Hermes V1, covering what’s new, what’s changing, and what’s ahead for React Native performance.

cover

Dec 4Article

How to Optimize Your Android App Startup Time With Hermes

Learn how to achieve better performance and optimize Android app startup time with Hermes.

cover

Jun 14Article

Technical Guide, Part 2: Integrating Hermes With React Native

Interested in the Hermes engine? Check the second part of our expert guide to find out how to integrate Hermes with React Native.

cover

May 26Article

Technical Guide, Part 1: Compiling Hermes for Apple Platforms

Want to use Hermes in your React Native app on iOS? Find out how to compile Hermes for Apple platforms. Check the first part of our expert technical guide.

cover

May 11Podcast

React Native 0.64 With Hermes for iOS

Discover how Hermes boosts React Native performance on iOS and macOS, with insights into AOT, bytecode precompilation, and the future of Hermes support.

cover

Apr 14Article

Bringing Hermes to iOS in React Native 0.64

Hermes is now available for iOS as well. Find out more about this JS engine - check the first part of our series on bringing Hermes to iOS.

cover

Mar 19Tutorial

The Hard Way vs. The React Native AI SDK Way: Stop Writing Custom Modules for Every Model

Learn how React Native AI uses a unified provider model to switch between cloud and on-device LLMs without rewriting application logic, enabling reliable AI experiences online and offline.

cover

Mar 12Tutorial

Build Smarter Apps: Tool Calling & AI Orchestration Explained

Learn how on-device models in React Native can call tools, interact with external APIs, and return structured outputs you can use directly in application logic.

cover

Mar 5Tutorial

MLC LLM + React Native: On-Device AI Without the Pain

Learn how to run third-party on-device LLMs in React Native using MLC LLM. Choose your models, run them efficiently across platforms, and keep a unified JavaScript API with React Native AI.

cover

Feb 24Tutorial

Intelligent Fallbacks with Apple Intelligence in React Native

Learn how to use Apple’s built-in Foundation Models in React Native apps, reduce memory usage, and enable fast, fully on-device AI with React Native AI Apple.

cover

Feb 10Tutorial

What Is the React Native AI SDK? A Complete Intro & Quickstart

Learn why on-device AI matters for React Native apps, how local LLMs behave offline, and what problems React Native AI is designed to solve from day one.

cover

Jan 29Tutorial

Implementing an Android TurboModule with Kotlin

Learn how to implement a React Native TurboModule on Android, from the TypeScript spec and Codegen to the Kotlin implementation and package registration.

cover

Jan 19Tutorial

Working with Different Threads in Swift TurboModules

Learn how JavaScript, native module, background, and main threads interact in React Native TurboModules, and how to use GCD queues to run async work safely in Swift.

cover

Jan 9Tutorial

How to Add Type-Safe Constants to Swift TurboModules

Learn how to expose typed, immutable constants from a Swift TurboModule using Codegen, and get full end-to-end type safety between native and JavaScript.

cover

Dec 30Tutorial

Adding Event Emitters to Your TurboModule in Swift

Learn how to emit native events from a Swift TurboModule and subscribe to them in JavaScript, including proper memory management and Codegen integration.

cover

Dec 22Tutorial

Writing Your First TurboModule in Swift

Learn how to build a fully working TurboModule in Swift, integrate it with Codegen, and bridge it through Objective‑C inside an Expo app.