Faster emojify() by avoiding string.replace() entirely #4049
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
(Previously: #4046)
This speeds up
emojify()
by avoidingstring.replace(regexp)
entirely. Instead I pull in a small extra dependency I wrote, substring-trie, which implements a Trie data structure to do a prefix-based lookup that's faster than whatemojione.regUnicode
was doing.Testing on a Nexus 5X in Chrome, I see the cost of
emojify
for switching from the "getting started" column to the local timeline go from 24.4ms to 2.3ms:I used
performance.measure()
to measure the cost of building the Trie itself, and I got 18.7ms, so it's worth the tradeoff. Alsosubstring-trie
is 407 bytes minified.Note also the extra tests, which I wrote to ensure I didn't regress anything. One detail that's important is that
regUnicode
returns the longest matched substring, which is also the behavior ofsubstring-trie
(and there's a test to confirm this).