From 62c91290c234e19f58971e058f9745863e2cbf99 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 15 Nov 2023 19:51:25 +0100 Subject: [PATCH] benchmark: add misc/startup-cli-version benchmark This benchmarks the startup of various CLI tools that are already checked into the source code. We use --version because the output tends to be minimal and fewer operations are done to generate these so that the startup cost is still dominated by a more indispensible part of the CLI. PR-URL: https://github.com/nodejs/node/pull/50684 Reviewed-By: Yagiz Nizipli Reviewed-By: James M Snell --- benchmark/misc/startup-cli-version.js | 51 +++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 benchmark/misc/startup-cli-version.js diff --git a/benchmark/misc/startup-cli-version.js b/benchmark/misc/startup-cli-version.js new file mode 100644 index 00000000000000..52ab6bc9f582f3 --- /dev/null +++ b/benchmark/misc/startup-cli-version.js @@ -0,0 +1,51 @@ +'use strict'; +const common = require('../common.js'); +const { spawnSync } = require('child_process'); +const path = require('path'); + +// This benchmarks the startup of various CLI tools that are already +// checked into the source code. We use --version because the output +// tends to be minimal and fewer operations are done to generate +// these so that the startup cost is still dominated by a more +// indispensible part of the CLI. +const bench = common.createBenchmark(main, { + cli: [ + 'tools/node_modules/eslint/bin/eslint.js', + 'deps/npm/bin/npm-cli.js', + 'deps/corepack/dist/corepack.js', + ], + count: [30], +}); + +function spawnProcess(cli, bench, state) { + const cmd = process.execPath || process.argv[0]; + while (state.finished < state.count) { + const child = spawnSync(cmd, [cli, '--version'], { + env: { npm_config_loglevel: 'silent', ...process.env }, + }); + // Log some information for debugging if it fails, which it shouldn't. + if (child.status !== 0) { + console.log('---- STDOUT ----'); + console.log(child.stdout.toString()); + console.log('---- STDERR ----'); + console.log(child.stderr.toString()); + throw new Error(`Child process stopped with exit code ${child.status}`); + } + state.finished++; + if (state.finished === 0) { + // Finished warmup. + bench.start(); + } + + if (state.finished === state.count) { + bench.end(state.count); + } + } +} + +function main({ count, cli }) { + cli = path.resolve(__dirname, '../../', cli); + const warmup = 3; + const state = { count, finished: -warmup }; + spawnProcess(cli, bench, state); +}