Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
tags

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional stylelint cache
.stylelintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# vuepress v2.x temp and cache directory
.temp
.cache

# Docusaurus cache and generated files
.docusaurus

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
4 changes: 4 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# We use save-exact because the purpose of this
# repository is to find regressions, if we pull
# a new version of each package the results will not be consistent
save-exact=true
86 changes: 86 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
const fs = require('node:fs/promises');
const { setTimeout: delay } = require('node:timers/promises');
const path = require('node:path');
const { spawn } = require('node:child_process');
const assert = require('node:assert');
const autocannon = require('autocannon');

const runner = {
autocannon: (opts) => {
return autocannon({
url: `http://localhost:${opts.http.serverPort}`,
connections: 100,
pipelining: 1,
duration: 10 * opts.http.routes.length,
requests: opts.http.routes,
})
},
}

const parser = {
autocannon: (settings, result) => {
return {
name: settings.name,
method: 'autocannon',
http: {
totalReq: asNumber(result.requests),
duration: result.duration,
errors: result.errors,
}
};
}
}

const ALLOWED_BENCHMARKER = ['autocannon', 'benchmarkjs'];

function asNumber (stat) {
const result = Object.create(null)
for (const k of Object.keys(stat)) {
result[k] = stat[k].toLocaleString(undefined, {
// to show all digits
maximumFractionDigits: 20
})
}
return result
}

function spawnServer(settings) {
const server = spawn(
process.execPath,
[settings.http.server],
{ stdio: 'inherit' },
);
return server;
}

async function runBenchmark(settings) {
assert.ok(settings.http.server, 'HTTP Benchmark must have a server to be spawned');
assert.ok(ALLOWED_BENCHMARKER.includes(settings.benchmarker), 'Invalid settings.benchmarker');

let server = undefined;
if (settings.type === 'http') {
server = spawnServer(settings);
// TODO: replace this workaround to use IPC to know when server is up
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await delay(1000);
}

const benchRunner = runner[settings.benchmarker];
const benchParser = parser[settings.benchmarker];
const results = await benchRunner(settings);
if (server) {
server.kill('SIGINT');
}
return benchParser(settings, results);
}

async function main() {
const files = await fs.readdir(path.join(__dirname, './src'));
for (const file of files) {
if (file.match(/.*-benchmark\.js$/)) {
const bench = require(path.join(__dirname, './src/', file));
console.log(bench.name, 'results', await runBenchmark(bench));
}
}
}

main();
8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"dependencies": {
"fastify": "4.26.1"
},
"devDependencies": {
"autocannon": "7.15.0"
}
}
Loading