Ensure Null-Terminated JS Bundle in React Native
Description
There is an expensive copy operation for data buffer when loading and parsing JS Bundle in React Native. In my case, I have a 4.8
MB JS bundle. Xcode instrument profiler shows it takes up 15.81 MB trying to copy a NSData
object in ensureNullTerminated
function in NSDataBigString
class.
This is the brief process for RCTBridge
loading JS bundle
In Objc, NSData
is a static byte buffer that bridges to Data, which is a byte buffer in a contiguous region of memory. Here, NSDataBigString
class holds NSData
object constructed from JS bundle.
Inside react-native framework, it has to treat this data buffer in a contiguous region of memory as a null-terminated byte string (NTBS).&text=For%20example%2C%20the%20character%20array,%22cat%22%20in%20ASCII%20encoding.) .
A null-terminated byte string (NTBS) is a sequence of nonzero bytes followed by a byte with value zero (the terminating null character). Each byte in a byte string encodes one character of some character set. For example, the character array {‘\x63’,’\x61’,’\x74’,’\0’} is an NTBS holding the string “cat” in ASCII encoding.
While, this data buffer doesn’t end with \0
character. Besides, In Objective-C, NSData
is an immutable object. In order to add the Null
byte, \0
character, firstly, it has to copy the original immutable NSData
object and construct a mutable object; then append \0
to the data buffer.
React Native version:
Run react-native info
in your terminal and copy the results here.
react-native: v0.63.3
device: iPhone 5s
OS version: 12.4.8
Steps To Reproduce
Provide a detailed list of steps that reproduce the issue.
- open
RNTester
inreact-native
repo.react-native/packages/rn-tester
- find
ensureNullTerminated
and set a breakpoint there - run the
RNTester
Snack, code example, screenshot, or link to a repository:
Solution
- Add
\0
character ahead of time when building JS bundle. By doing this, you can avoid this copy operation during bundle loading in App launching phase.
Ref
Author : RY Zheng
Link : https://suelan.github.io/2021/02/13/20210213-ensure-null-terminated-string/
License : MIT
