current commit
260817.15 · repl: add benchmarks
'use strict';

const common = require('../common.js');
const repl = require('node:repl');
const { PassThrough, Writable } = require('node:stream');

const bench = common.createBenchmark(main, {
  n: [5e3],
  query: [
    'cons',
    'console.lo',
    'Buffer.prototype.wri',
    "require('f",
  ],
  useGlobal: [0, 1],
});

function main({ n, query, useGlobal }) {
  const input = new PassThrough();
  const output = new Writable({ write(c, e, cb) { cb(); } });
  const server = new repl.REPLServer({
    input,
    output,
    terminal: false,
    useGlobal: !!useGlobal,
  });

  // Inspector callbacks do not keep the event loop alive on their own.
  const keepAlive = setInterval(() => {}, 0x7fffffff);
  let remaining = n;

  function complete() {
    server.complete(query, onComplete);
  }

  function onComplete(err) {
    if (err) {
      throw err;
    }

    if (--remaining === 0) {
      bench.end(n);
      clearInterval(keepAlive);
      server.close();
      return;
    }

    setImmediate(complete);
  }

  bench.start();
  setImmediate(complete);
}