Script Preparation code:
x
 
function get1024Bytes(n) {
  const bytes = new Uint8Array(n * 1024);
  for (let i = 0; i < bytes.length; i += 1) {
    bytes[i] = Math.random() * 0xff;
  }
  return bytes;
}
const bytes = get1024Bytes(1024);
/*
   Note that Function.prototype.apply() has a limit, so not using it to creat binary string here for convenience.
   
   To use it, split the array into smaller chunks first.
   
       String.fromCodePoint.apply(null, bytes);  // bytes.length should not exceed the maximum
   See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
*/
const binString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join("");
Tests:
  • Uint8Array.from + codePointAt

     
    return Uint8Array.from(binString, (m) => m.codePointAt(0));
  • Uint8Array.from + charCodeAt

     
    return Uint8Array.from(binString, (m) => m.charCodeAt(0));
  • for-loop + codePointAt

     
    const bytes = new Uint8Array(binString.length);
    for (let i = 0; i < bytes.length; i += 1) {
        bytes[i] = binString[i].codePointAt(0);
    }
    return bytes;
  • for-loop + charCodeAt

     
    const bytes = new Uint8Array(binString.length);
    for (let i = 0; i < bytes.length; i += 1) {
        bytes[i] = binString[i].charCodeAt(0);
    }
    return bytes;
  • for-loop + Uint8Array.from + codePointAt (small chunk)

     
      const QUANTUM = 128;
      const bytes = new Uint8Array(binString.length);
      for (let i = 0; i < binString.length; i += QUANTUM) {
        let j = i;
        for (const b of Uint8Array.from(binString.slice(i, i + QUANTUM), (m) => m.codePointAt(0))) {
            bytes[j] = b;
            j += 1;
        }
      }
      return bytes;
  • for-loop + Uint8Array.from + charCodeAt (small chunk)

     
      const QUANTUM = 128;
      const bytes = new Uint8Array(binString.length);
      for (let i = 0; i < binString.length; i += QUANTUM) {
        let j = i;
        for (const b of Uint8Array.from(binString.slice(i, i + QUANTUM), (m) => m.charCodeAt(0))) {
            bytes[j] = b;
            j += 1;
        }
      }
      return bytes;
  • for-loop + Uint8Array.from + codePointAt (big chunk)

     
      const QUANTUM = 32768;
      const bytes = new Uint8Array(binString.length);
      for (let i = 0; i < binString.length; i += QUANTUM) {
        let j = i;
        for (const b of Uint8Array.from(binString.slice(i, i + QUANTUM), (m) => m.codePointAt(0))) {
            bytes[j] = b;
            j += 1;
        }
      }
      return bytes;
  • for-loop + Uint8Array.from + charCodeAt (big chunk)

     
      const QUANTUM = 32768;
      const bytes = new Uint8Array(binString.length);
      for (let i = 0; i < binString.length; i += QUANTUM) {
        let j = i;
        for (const b of Uint8Array.from(binString.slice(i, i + QUANTUM), (m) => m.charCodeAt(0))) {
            bytes[j] = b;
            j += 1;
        }
      }
      return bytes;
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    Uint8Array.from + codePointAt
    Uint8Array.from + charCodeAt
    for-loop + codePointAt
    for-loop + charCodeAt
    for-loop + Uint8Array.from + codePointAt (small chunk)
    for-loop + Uint8Array.from + charCodeAt (small chunk)
    for-loop + Uint8Array.from + codePointAt (big chunk)
    for-loop + Uint8Array.from + charCodeAt (big chunk)

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 4 months ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Chrome 133 on Windows
View result in a separate tab
Test name Executions per second
Uint8Array.from + codePointAt 12.1 Ops/sec
Uint8Array.from + charCodeAt 12.9 Ops/sec
for-loop + codePointAt 9.8 Ops/sec
for-loop + charCodeAt 8.5 Ops/sec
for-loop + Uint8Array.from + codePointAt (small chunk) 8.7 Ops/sec
for-loop + Uint8Array.from + charCodeAt (small chunk) 8.7 Ops/sec
for-loop + Uint8Array.from + codePointAt (big chunk) 9.0 Ops/sec
for-loop + Uint8Array.from + charCodeAt (big chunk) 8.9 Ops/sec