@ 261106.2
current
'use strict';

// buf.write(string, 'utf8') for strings whose in-memory representation is
// one-byte (Latin-1) or two-byte (UTF-16), which take different encoder paths.
const common = require('../common.js');
const bench = common.createBenchmark(main, {
  chars: ['one-byte', 'two-byte', 'two-byte-astral', 'two-byte-lone-surrogate'],
  len: [16, 256, 2048, 65536],
  n: [5e5],
});

function makeString(chars, len) {
  switch (chars) {
    case 'one-byte':
      return 'aé'.repeat(len / 2);
    case 'two-byte':
      return 'aé€日'.repeat(len / 4);
    case 'two-byte-astral':
      return 'aé€日\u{1F600}'.repeat(len / 6).padEnd(len, 'a');
    case 'two-byte-lone-surrogate':
      return 'aé€日'.repeat(len / 4 - 1) + 'ab\ud800c';
    default:
      throw new Error(chars);
  }
}

function main({ chars, len, n }) {
  const string = makeString(chars, len);
  const buf = Buffer.allocUnsafe(Buffer.byteLength(string));
  if (len >= 65536) n = Math.floor(n / 32);
  bench.start();
  for (let i = 0; i < n; ++i) {
    buf.write(string, 0, 'utf8');
  }
  bench.end(n);
}