From 0baeb58fff62282cf5d28cbc0384472a49cd47ca Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 06:15:06 +0700 Subject: [PATCH 1/8] edit gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a569048..cbf7c30 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -/node_modules +node_modules /.tshy /lib /dist From 4b6849e4b83d30ddf83a742036ea01a6ab846c8c Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 07:41:18 +0700 Subject: [PATCH 2/8] add bench folder --- bench/package.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 bench/package.json diff --git a/bench/package.json b/bench/package.json new file mode 100644 index 0000000..efdcc7d --- /dev/null +++ b/bench/package.json @@ -0,0 +1,5 @@ +{ + "name": "bench", + "private": true, + "type": "module" +} From 62076c0ee12401c71e3c5e30d2b7aa2a2ef662e9 Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 07:42:12 +0700 Subject: [PATCH 3/8] add tinybench --- bench/package-lock.json | 23 +++++++++++++++++++++++ bench/package.json | 5 ++++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 bench/package-lock.json diff --git a/bench/package-lock.json b/bench/package-lock.json new file mode 100644 index 0000000..764f861 --- /dev/null +++ b/bench/package-lock.json @@ -0,0 +1,23 @@ +{ + "name": "bench", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bench", + "devDependencies": { + "tinybench": "^5.1.0" + } + }, + "node_modules/tinybench": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-5.1.0.tgz", + "integrity": "sha512-LXKNtFualiKOm6gADe1UXPtf8+Nfn1CtPMEHAT33Fd2YjQatrujkDcK0+4wRC1X6t7fxUDXUs6BsvuIgfkDgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + } + } +} diff --git a/bench/package.json b/bench/package.json index efdcc7d..9e07344 100644 --- a/bench/package.json +++ b/bench/package.json @@ -1,5 +1,8 @@ { "name": "bench", "private": true, - "type": "module" + "type": "module", + "devDependencies": { + "tinybench": "^5.1.0" + } } From 9f76a560e5b1d10bb1e0a0f71a75b76a40f4f729 Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 08:36:44 +0700 Subject: [PATCH 4/8] make benchmark --- bench/bench.js | 31 ++++++++++++++++++++++++++++ bench/fixture/package.json | 15 ++++++++++++++ bench/package-lock.json | 41 ++++++++++++++++++++++++++++++++++++++ bench/package.json | 2 ++ 4 files changed, 89 insertions(+) create mode 100644 bench/bench.js create mode 100644 bench/fixture/package.json diff --git a/bench/bench.js b/bench/bench.js new file mode 100644 index 0000000..a75b46c --- /dev/null +++ b/bench/bench.js @@ -0,0 +1,31 @@ +import {packageUp, packageUpSync} from 'package-up'; +import {up as empathic} from 'empathic/package'; +import {findPackagePath, findPackagePathSync} from '../lib/main.js'; +import {Bench} from 'tinybench'; +import {join} from 'node:path'; + +function formatResult(task) { + return `${task.name} × ${Math.round(task.result.throughput.mean).toString()} (ops/s) \xb1${task.result.throughput.rme.toFixed(2)}% (${task.result.samples.length} sampled)`; +} + +const dirs = 'abcdefghij'; +const depths = [1, 3, 5, 10]; + +depths.forEach(async (dep) => { + const name = `${dep} depth${dep === 1 ? '' : 's'}`; + const start = join(import.meta.dirname, 'fixture', ...dirs.substring(0, dep)); + const bench = new Bench({name}); + + bench + .add('package-up', async () => await packageUp(start)) + .add('package-up (sync)', () => packageUpSync(start)) + .add('empathic (sync)', () => empathic(start)) + .add('fd-package-json', async () => await findPackagePath(start)) + .add('fd-package-json (sync)', () => findPackagePathSync(start)); + + await bench.run(); + + console.log(name); + bench.tasks.forEach((task) => console.log(formatResult(task))); + console.log(''); +}); diff --git a/bench/fixture/package.json b/bench/fixture/package.json new file mode 100644 index 0000000..5b666b7 --- /dev/null +++ b/bench/fixture/package.json @@ -0,0 +1,15 @@ +{ + "name": "simple-package", + "private": true, + "version": "1.0.0", + "description": "A simple package that does nothing.", + "keywords": [ + "some", + "keywords" + ], + "author": "That Guy", + "license": "MIT", + "type": "module", + "dependencies": { + } +} diff --git a/bench/package-lock.json b/bench/package-lock.json index 764f861..aed7b73 100644 --- a/bench/package-lock.json +++ b/bench/package-lock.json @@ -6,9 +6,50 @@ "": { "name": "bench", "devDependencies": { + "empathic": "^2.0.0", + "package-up": "^5.0.0", "tinybench": "^5.1.0" } }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz", + "integrity": "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tinybench": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-5.1.0.tgz", diff --git a/bench/package.json b/bench/package.json index 9e07344..d39dd41 100644 --- a/bench/package.json +++ b/bench/package.json @@ -3,6 +3,8 @@ "private": true, "type": "module", "devDependencies": { + "empathic": "^2.0.0", + "package-up": "^5.0.0", "tinybench": "^5.1.0" } } From 1fac6617e84c428d1c68fa2fb463d63ed2739169 Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 08:42:37 +0700 Subject: [PATCH 5/8] use file protocol --- bench/bench.js | 2 +- bench/package-lock.json | 24 ++++++++++++++++++++++++ bench/package.json | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/bench/bench.js b/bench/bench.js index a75b46c..ddf708a 100644 --- a/bench/bench.js +++ b/bench/bench.js @@ -1,6 +1,6 @@ import {packageUp, packageUpSync} from 'package-up'; import {up as empathic} from 'empathic/package'; -import {findPackagePath, findPackagePathSync} from '../lib/main.js'; +import {findPackagePath, findPackagePathSync} from 'fd-package-json'; import {Bench} from 'tinybench'; import {join} from 'node:path'; diff --git a/bench/package-lock.json b/bench/package-lock.json index aed7b73..3472ddd 100644 --- a/bench/package-lock.json +++ b/bench/package-lock.json @@ -7,10 +7,30 @@ "name": "bench", "devDependencies": { "empathic": "^2.0.0", + "fd-package-json": "file:../", "package-up": "^5.0.0", "tinybench": "^5.1.0" } }, + "..": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-up-path": "^4.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.27.0", + "@types/node": "^20.11.24", + "c8": "^10.1.3", + "eslint": "^9.27.0", + "eslint-config-google": "^0.14.0", + "premove": "^4.0.0", + "prettier": "^3.5.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.1" + } + }, "node_modules/empathic": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", @@ -21,6 +41,10 @@ "node": ">=14" } }, + "node_modules/fd-package-json": { + "resolved": "..", + "link": true + }, "node_modules/find-up-simple": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", diff --git a/bench/package.json b/bench/package.json index d39dd41..8f4cff1 100644 --- a/bench/package.json +++ b/bench/package.json @@ -4,6 +4,7 @@ "type": "module", "devDependencies": { "empathic": "^2.0.0", + "fd-package-json": "file:../", "package-up": "^5.0.0", "tinybench": "^5.1.0" } From d4d5eadcd3db32aa67e86a34b0ebe4abdab80b95 Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 15:10:42 +0700 Subject: [PATCH 6/8] edit bench.js --- bench/bench.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bench/bench.js b/bench/bench.js index ddf708a..c21dc30 100644 --- a/bench/bench.js +++ b/bench/bench.js @@ -5,7 +5,7 @@ import {Bench} from 'tinybench'; import {join} from 'node:path'; function formatResult(task) { - return `${task.name} × ${Math.round(task.result.throughput.mean).toString()} (ops/s) \xb1${task.result.throughput.rme.toFixed(2)}% (${task.result.samples.length} sampled)`; + return `${task.name} × ${Math.round(task.result.throughput.mean).toString()} (ops/s) \xb1${task.result.throughput.rme.toFixed(2)}% (${task.result.samples.length} runs sampled)`; } const dirs = 'abcdefghij'; @@ -25,7 +25,7 @@ depths.forEach(async (dep) => { await bench.run(); - console.log(name); + console.log(`# ${name}`); bench.tasks.forEach((task) => console.log(formatResult(task))); console.log(''); }); From 45fe838c92394fabc115ab42dd37ec09d00580ec Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Fri, 14 Nov 2025 15:30:45 +0700 Subject: [PATCH 7/8] fix param --- bench/bench.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bench/bench.js b/bench/bench.js index c21dc30..8d7e4be 100644 --- a/bench/bench.js +++ b/bench/bench.js @@ -13,15 +13,15 @@ const depths = [1, 3, 5, 10]; depths.forEach(async (dep) => { const name = `${dep} depth${dep === 1 ? '' : 's'}`; - const start = join(import.meta.dirname, 'fixture', ...dirs.substring(0, dep)); - const bench = new Bench({name}); + const cwd = join(import.meta.dirname, 'fixture', ...dirs.substring(0, dep)); + const bench = new Bench({name, warmup: true}); bench - .add('package-up', async () => await packageUp(start)) - .add('package-up (sync)', () => packageUpSync(start)) - .add('empathic (sync)', () => empathic(start)) - .add('fd-package-json', async () => await findPackagePath(start)) - .add('fd-package-json (sync)', () => findPackagePathSync(start)); + .add('package-up', async () => await packageUp({cwd})) + .add('package-up (sync)', () => packageUpSync({cwd})) + .add('empathic (sync)', () => empathic({cwd})) + .add('fd-package-json', async () => await findPackagePath(cwd)) + .add('fd-package-json (sync)', () => findPackagePathSync(cwd)); await bench.run(); From ccd597e320ec967f26fa79efba632896f181f6df Mon Sep 17 00:00:00 2001 From: hyperz111 Date: Sun, 16 Nov 2025 00:07:23 +0700 Subject: [PATCH 8/8] refactor --- bench/bench.js | 21 ++++++++++++++------- bench/fixture/a/b/c/d/e/f/g/h/i/j/.gitkeep | 0 2 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 bench/fixture/a/b/c/d/e/f/g/h/i/j/.gitkeep diff --git a/bench/bench.js b/bench/bench.js index 8d7e4be..fed1279 100644 --- a/bench/bench.js +++ b/bench/bench.js @@ -3,15 +3,12 @@ import {up as empathic} from 'empathic/package'; import {findPackagePath, findPackagePathSync} from 'fd-package-json'; import {Bench} from 'tinybench'; import {join} from 'node:path'; - -function formatResult(task) { - return `${task.name} × ${Math.round(task.result.throughput.mean).toString()} (ops/s) \xb1${task.result.throughput.rme.toFixed(2)}% (${task.result.samples.length} runs sampled)`; -} +import {styleText} from 'node:util'; const dirs = 'abcdefghij'; const depths = [1, 3, 5, 10]; -depths.forEach(async (dep) => { +for (const dep of depths) { const name = `${dep} depth${dep === 1 ? '' : 's'}`; const cwd = join(import.meta.dirname, 'fixture', ...dirs.substring(0, dep)); const bench = new Bench({name, warmup: true}); @@ -26,6 +23,16 @@ depths.forEach(async (dep) => { await bench.run(); console.log(`# ${name}`); - bench.tasks.forEach((task) => console.log(formatResult(task))); + + const table = bench.table(); + for (const row of table) { + for (const prop in row) { + const isName = prop === 'Task name'; + console.log( + `${isName ? '-' : ' '} ${isName ? '' : `${prop}: `}${styleText(isName ? ['bold', 'underline'] : 'none', String(row[prop]))}` + ); + } + } + console.log(''); -}); +} diff --git a/bench/fixture/a/b/c/d/e/f/g/h/i/j/.gitkeep b/bench/fixture/a/b/c/d/e/f/g/h/i/j/.gitkeep new file mode 100644 index 0000000..e69de29