current commit
261101.6 · benchmark: merge crc32c into crc32 zlib benchmark
'use strict';

const common = require('../common.js');
const zlib = require('zlib');

// Benchmark crc32 and crc32c on Buffer and String inputs across sizes.
// Iteration count is scaled inversely with input length to keep runtime sane.
// Example:
//   node benchmark/zlib/crc32.js algorithm=crc32c type=buffer len=4096 n=4000000
//   ./out/Release/node benchmark/zlib/crc32.js --test

const bench = common.createBenchmark(main, {
  algorithm: ['crc32', 'crc32c'],
  type: ['buffer', 'string'],
  len: [32, 256, 4096, 65536],
  n: [4e6],
});

function makeBuffer(size) {
  const buf = Buffer.allocUnsafe(size);
  for (let i = 0; i < size; i++) buf[i] = (i * 1103515245 + 12345) & 0xff;
  return buf;
}

function makeAsciiString(size) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
  let out = '';
  for (let i = 0, j = 0; i < size; i++, j = (j + 7) % chars.length) out += chars[j];
  return out;
}

function main({ algorithm, type, len, n }) {
  const crc = zlib[algorithm];

  // Scale iterations so that total processed bytes roughly constant around n*4096 bytes.
  const scale = 4096 / len;
  const iters = Math.max(1, Math.floor(n * scale));

  const data = type === 'buffer' ? makeBuffer(len) : makeAsciiString(len);

  let acc = 0;
  for (let i = 0; i < Math.min(iters, 10000); i++) acc ^= crc(data, 0);

  bench.start();
  let sum = 0;
  for (let i = 0; i < iters; i++) sum ^= crc(data, 0);
  bench.end(iters);

  if (sum === acc - 1) process.stderr.write('');
}