Base64是一种二进制到文本的编码方案,它将任意二进制数据(如图像、文件或任何字节序列)使用64个字符的字母表(A-Z、a-z、0-9、+、/)转换为安全的、可打印的ASCII字符串。浏览器在JavaScript中使用它,以便在代码或HTML中直接嵌入二进制数据,或以文本形式传输二进制数据。
浏览器最近添加了方便且安全的函数来处理base64:Uint8Array.toBase64() 和 Uint8Array.fromBase64()。尽管它们有几个参数,但归结起来就是一个编码函数和一个解码函数。
|
|
编码时,它从输入中取出24位。这24位被分成四个6位的段,每个6位的值(范围0到63)被映射到Base64字母表中的一个特定字符:前26个字符是大写字母A-Z,接着26个是小写字母a-z,然后是数字0-9,最后是作为第62和第63个字符的+和/。当输入长度不是3字节的倍数时,使用等号=作为填充。
它们的速度能有多快?
假设每个CPU周期消耗3个字节并产生4个字节。以4.5 GHz的频率计算,编码到base64的速度将达到13.5 GB/s。我们预期另一个方向(解码)的性能会较低。编码时,任何输入都是有效的:任何二进制数据都可以。然而,解码时,我们必须处理错误并跳过空格。
我编写了一个浏览器内基准测试。你可以在你喜欢的浏览器中试试看。
我决定在我的Apple M4处理器上试试,看看各种浏览器有多快。我使用64 KB的数据块。速度是相对于二进制数据来测量的。
| 浏览器 | 编码速度 | 解码速度 |
|---|---|---|
| Safari | 17 GB/s | 9.4 GB/s |
| SigmaOS | 17 GB/s | 9.4 GB/s |
| Chrome | 19 GB/s | 4.6 GB/s |
| Edge | 19 GB/s | 4.6 GB/s |
| Brave | 19 GB/s | 4.6 GB/s |
| Servo | 0.34 GB/s | 0.40 GB/s |
| Firefox | 0.34 GB/s | 0.40 GB/s |
Safari的编码速度似乎比基于Chromium的浏览器(Chrome、Edge、Brave)稍慢一些,但其解码速度大约是后者的两倍。Servo和Firefox性能相似且较差,出乎意料的是解码速度比编码速度更快。我本可以尝试其他浏览器,但大多数似乎是Chromium或WebKit的衍生品。
作为背景参考,一台好的笔记本电脑的磁盘可以持续超过3 GB/s的读写速度。一些高端笔记本电脑的磁盘速度超过5 GB/s。理论上,你的Wi-Fi连接在使用Wi-Fi 7时可能接近5 GB/s。一些互联网服务提供商可能接近提供类似的网络速度,尽管你的互联网连接很可能要慢好几倍。
大多数浏览器的处理速度可能比你天真的猜测要快。它们比网络或磁盘更快。
注意:基于Chromium的浏览器上较慢的解码速度似乎取决于V8 JavaScript引擎,它首先将字符串解码到一个临时缓冲区,然后才从临时缓冲区复制到最终目的地。(参见 v8/src/builtins/builtins-typed-array.cc 中的 BUILTIN(Uint8ArrayFromBase64)。)
注意:来自Mozilla的Denis Palmeiro告诉我,Firefox即将进行的更改将提高base64函数的性能。在我使用Firefox nightly的测试中,性能提升了约20%。
Daniel Lemire, “How fast can browsers process base64 data?,” in Daniel Lemire’s blog, November 29, 2025, https://lemire.me/blog/2025/11/29/how-fast-can-browsers-process-base64-data/.