Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
String.fromCharCode & btoa vs base64ArrayBuffer function FIXED - big arrayBuffer
(version: 0)
Comparing performance of:
String.fromCharCode & btoa vs base64ArrayBuffer function
Created:
5 years ago
by:
Guest
Jump to the latest result
Script Preparation code:
var bytes = [84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46,84,104,105,115,32,105,115,32,97,32,115,97,109,112,108,101,32,112,97,114,97,103,114,97,112,104,46]; var uint16 = new Uint16Array(bytes); var uint8 = new Uint8Array(bytes); function base64ArrayBuffer(bytes) { "use asm"; var base64 = ''; const encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; const byteLength = bytes.byteLength|0; const byteRemainder = (byteLength % 3)|0; const mainLength = (byteLength - byteRemainder)|0; var a, b, c, d; var chunk; // Main loop deals with bytes in chunks of 3 for (var i = 0; i < mainLength; i = i + 3) { // Combine the three bytes into a single integer chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; // Use bitmasks to extract 6-bit segments from the triplet a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 d = chunk & 63; // 63 = 2^6 - 1 // Convert the raw binary segments to the appropriate ASCII encoding base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; } // Deal with the remaining bytes and padding if (byteRemainder == 1) { chunk = bytes[mainLength]; a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 // Set the 4 least significant bits to zero b = (chunk & 3) << 4; // 3 = 2^2 - 1 base64 += encodings[a] + encodings[b] + '=='; } else if (byteRemainder == 2) { chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 // Set the 2 least significant bits to zero; c = (chunk & 15) << 2; // 15 = 2^4 - 1 base64 += encodings[a] + encodings[b] + encodings[c] + '='; } return base64; }
Tests:
String.fromCharCode & btoa
globalThis.btoa(String.fromCharCode.apply(null, uint16));
base64ArrayBuffer function
base64ArrayBuffer(uint8);
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (2)
Previous results
Fork
Test case name
Result
String.fromCharCode & btoa
base64ArrayBuffer function
Fastest:
N/A
Slowest:
N/A
Latest run results:
Run details:
(Test run date:
7 months ago
)
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Browser/OS:
Chrome 140 on Mac OS X 10.15.7
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
String.fromCharCode & btoa
368418.1 Ops/sec
base64ArrayBuffer function
205115.8 Ops/sec
Autogenerated LLM Summary
(model
llama3.2:3b
, generated one year ago):
A challenging benchmark! After carefully reviewing the provided code and the latest benchmark results, I'll attempt to provide an answer. **Base64 Encoding Function** The `base64ArrayBuffer` function appears to be implementing the base64 encoding algorithm, which is used to convert binary data (like arrays of unsigned 8-bit integers) into a string of characters that can be easily stored or transmitted. Here's a simplified explanation of how it works: 1. **Chunking**: The input array of unsigned 8-bit integers is divided into chunks of three elements each (`mainLength`). 2. **Bitmasks and Extraction**: Each chunk is processed using bitmasks to extract six-bit segments from the triplet. 3. **Encoding**: These segments are then converted to their corresponding ASCII characters using a lookup table (`encodings`). 4. **Padding**: The remaining bytes (if any) are handled separately, depending on whether the length of the input array is one or two bytes more than a multiple of three. **Benchmarks** Comparing the two test cases: * `String.fromCharCode & btoa`: This test case appears to be comparing the performance of the built-in JavaScript functions `btoa` (base64 encoding) and `String.fromCharCode.apply(null, uint16)` (creating an array of Unicode code points). The latter is a more naive approach that may not take advantage of optimization techniques or compiler optimizations. * `base64ArrayBuffer`: This test case measures the performance of the custom `base64ArrayBuffer` function. The results show that the custom `base64ArrayBuffer` function outperforms both test cases. This suggests that: 1. The built-in JavaScript functions might be optimized for specific use cases or platforms. 2. The custom implementation has been carefully crafted to minimize unnecessary operations and optimize performance. **Conclusion** Based on the provided code and benchmark results, it's clear that the `base64ArrayBuffer` function is a well-optimized implementation of base64 encoding. Its performance superiority over other test cases suggests that it may be worth considering for use in applications where efficient encoding is critical.
Related benchmarks:
String.fromCharCode & btoa vs base64ArrayBuffer function
String.fromCharCode & btoa vs base64ArrayBuffer function FIXED
Decoding batching vs text decoder
TextDecoder vs String.fromCharCode Big
Comments
Confirm delete:
Do you really want to delete benchmark?