feat: use native alternatives to encode/decode base64#136
Open
mrkishi wants to merge 4 commits intosveltejs:mainfrom
Open
feat: use native alternatives to encode/decode base64#136mrkishi wants to merge 4 commits intosveltejs:mainfrom
mrkishi wants to merge 4 commits intosveltejs:mainfrom
Conversation
Based on Svelte's benchmark scaffolding.
🦋 Changeset detectedLatest commit: 00fc6db The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
The Typed Array support added in #69 included a js implementation of
atob/btoa, because they're deprecated by Node.These days, we have a couple of reliable (and more performant) alternatives:
Uint8Arrayprovides bothfromBase64andtoBase64.Buffercan be used to perform the conversions.atobandbtoaare still considerably faster than a pure js implementation.This PR includes the three options, selected at runtime based on
Uint8Array.fromBase64andprocess.versions.nodeavailability.On the version bump
I made this a minor change, but there's a slight modification to the stringified format (to avoid an extrasubarraycall). Depending on the answer to #130, this might be cause for a major, or the format change could be dropped while keeping the native base64 codecs.Edit: Since there have been
patchreleases changing the format, I assume there's been no commitment to keeping it stable.Benchmarks
On my machine, it benchmarks orders of magnitude faster across small (100 bytes), medium (10kb) and large (1mb)
ArrayBufferworkloads.Alternatives
I believe this supersedes both #90 and #107 since they don't meaningfully improve the encoded size for the performance loss (while they're both faster than status quo, they're still a couple orders slower than native base64).
Stacked on #135 to use the benchmarks.