'use strict'; const common = require('../common.js'); const StringDecoder = require('string_decoder').StringDecoder; const bench = common.createBenchmark(main, { encoding: ['ascii', 'utf8', 'base64-utf8', 'base64-ascii', 'utf16le'], inLen: [32, 128, 1024, 4096], chunkLen: [16, 64, 256, 1024], n: [25e5], }); const UTF8_ALPHA = 'Blåbærsyltetøy'; const ASC_ALPHA = 'Blueberry jam'; const UTF16_BUF = Buffer.from('Blåbærsyltetøy', 'utf16le'); function main({ encoding, inLen, chunkLen, n }) { let alpha; let buf; const chunks = []; let str = ''; const isBase64 = (encoding === 'base64-ascii' || encoding === 'base64-utf8'); if (encoding === 'ascii' || encoding === 'base64-ascii') alpha = ASC_ALPHA; else if (encoding === 'utf8' || encoding === 'base64-utf8') alpha = UTF8_ALPHA; else if (encoding === 'utf16le') { buf = UTF16_BUF; str = Buffer.alloc(0); } else throw new Error('Bad encoding'); const sd = new StringDecoder(isBase64 ? 'base64' : encoding); for (let i = 0; i < inLen; ++i) { if (i > 0 && (i % chunkLen) === 0 && !isBase64) { if (alpha) { chunks.push(Buffer.from(str, encoding)); str = ''; } else { chunks.push(str); str = Buffer.alloc(0); } } if (alpha) str += alpha[i % alpha.length]; else { let start = i; let end = i + 2; if (i % 2 !== 0) { ++start; ++end; } str = Buffer.concat([ str, buf.slice(start % buf.length, end % buf.length), ]); } } if (!alpha) { if (str.length > 0) chunks.push(str); } else if (str.length > 0 && !isBase64) chunks.push(Buffer.from(str, encoding)); if (isBase64) { str = Buffer.from(str, 'utf8').toString('base64'); while (str.length > 0) { const len = Math.min(chunkLen, str.length); chunks.push(Buffer.from(str.substring(0, len), 'utf8')); str = str.substring(len); } } const nChunks = chunks.length; bench.start(); for (let i = 0; i < n; ++i) { for (let j = 0; j < nChunks; ++j) sd.write(chunks[j]); } bench.end(n); }