From e18b9535808f7e03c13478b7d744fdb511e34071 Mon Sep 17 00:00:00 2001 From: Tim Seckinger Date: Tue, 9 Feb 2021 22:30:44 +0100 Subject: [PATCH] test(perf): add per test file overhead benchmark --- .gitignore | 2 ++ benchmarks/test-file-overhead/.gitignore | 1 + benchmarks/test-file-overhead/0.test.js | 1 + benchmarks/test-file-overhead/README.md | 7 +++++++ benchmarks/test-file-overhead/package.json | 5 +++++ benchmarks/test-file-overhead/prepare.sh | 4 ++++ benchmarks/test-file-overhead/yarn.lock | 11 +++++++++++ packages/jest-runtime/src/index.ts | 1 + 8 files changed, 32 insertions(+) create mode 100644 benchmarks/test-file-overhead/.gitignore create mode 100644 benchmarks/test-file-overhead/0.test.js create mode 100644 benchmarks/test-file-overhead/README.md create mode 100644 benchmarks/test-file-overhead/package.json create mode 100755 benchmarks/test-file-overhead/prepare.sh create mode 100644 benchmarks/test-file-overhead/yarn.lock diff --git a/.gitignore b/.gitignore index d513cf11ba99..4e7db024f4c0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,8 @@ /website/translated_docs /website/i18n/* +/benchmarks/*/node_modules/ + /reports/* coverage diff --git a/benchmarks/test-file-overhead/.gitignore b/benchmarks/test-file-overhead/.gitignore new file mode 100644 index 000000000000..a68ced87888c --- /dev/null +++ b/benchmarks/test-file-overhead/.gitignore @@ -0,0 +1 @@ +[1-9]*.test.js diff --git a/benchmarks/test-file-overhead/0.test.js b/benchmarks/test-file-overhead/0.test.js new file mode 100644 index 000000000000..2929750922ea --- /dev/null +++ b/benchmarks/test-file-overhead/0.test.js @@ -0,0 +1 @@ +it('is fast', () => {}); diff --git a/benchmarks/test-file-overhead/README.md b/benchmarks/test-file-overhead/README.md new file mode 100644 index 000000000000..d2be5fdc5d4f --- /dev/null +++ b/benchmarks/test-file-overhead/README.md @@ -0,0 +1,7 @@ +First, run `./prepare.sh` to generate the benchmark files. On Windows, use a Bash (WSL, Git, Cygwinm ...) to do this, but you can use CMD for the actual benchmark run if the CMD environment is what you want to benchmark for. + +To run the benchmark, use a benchmarking tool such as [hyperfine](https://github.com/sharkdp/hyperfine): + +```sh +hyperfine -w 3 -m 10 ../../jest /tmp/other-jest-clone-to-compare-against/jest +``` diff --git a/benchmarks/test-file-overhead/package.json b/benchmarks/test-file-overhead/package.json new file mode 100644 index 000000000000..148788b25446 --- /dev/null +++ b/benchmarks/test-file-overhead/package.json @@ -0,0 +1,5 @@ +{ + "jest": { + "testEnvironment": "node" + } +} diff --git a/benchmarks/test-file-overhead/prepare.sh b/benchmarks/test-file-overhead/prepare.sh new file mode 100755 index 000000000000..569a785e1294 --- /dev/null +++ b/benchmarks/test-file-overhead/prepare.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +for i in {1..499}; do + cp 0.test.js $i.test.js +done diff --git a/benchmarks/test-file-overhead/yarn.lock b/benchmarks/test-file-overhead/yarn.lock new file mode 100644 index 000000000000..00246b971113 --- /dev/null +++ b/benchmarks/test-file-overhead/yarn.lock @@ -0,0 +1,11 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 4 + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + languageName: unknown + linkType: soft diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 81f941c78d56..2aa3f6739ec6 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -100,6 +100,7 @@ type ModuleRegistry = Map; // * take sufficiently long to require to warrant an optimization. // When required from the outside, they use the worker's require cache and are thus // only loaded once per worker, not once per test file. +// Use /benchmarks/test-file-overhead to measure the impact. // Note that this only applies when they are required in an internal context; // users who require one of these modules in their tests will still get the module from inside the VM. // Prefer listing a module here only if it is impractical to use the jest-resolve-outside-vm-option where it is required,