Skip to content

Commit

Permalink
github action to update benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesKyburz committed Oct 14, 2019
1 parent c3f73b9 commit 815a4a1
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 864 deletions.
39 changes: 39 additions & 0 deletions .github/workflows/benchmarks.yml
@@ -0,0 +1,39 @@
name: Node benchmarks

on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 0 1 * *'

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: 10
- name: benchmarks
run: |
npm install
npm start y 100 10 40
npm start y 100 10 40
node_version=$(node --version)
benchmark_title=$(cat << EOF
# Benchmarks
* __Machine:__ $(uname -a) | $(node -r os -p -e "\`\${os.cpus().length} vCPUs | \${Math.ceil(os.totalmem() / (Math.pow(1024, 3)))}GB\`").
* __Method:__ \`autocannon -c 100 -d 40 -p 10 localhost:3000\` (two rounds; one to warm-up, one to measure).
* __Node:__ \`$node_version\`
* __Run:__ $(date)
EOF)
benchmark_table=$(node benchmark-compare.js -t -c)
strip_readme=$(node -r fs -p -e 'fs.readFileSync("./README.md", "utf-8").split(/# Benchmarks/)[0]')
git checkout master
echo -e "${strip_readme:?}\n${benchmark_title:?}\n\n${benchmark_table}" > README.md
git add README.md
git config user.name 'Github Actions'
git config user.email '<>'
git commit -m "Add new benchmarks to README.md"
git remote set-url --push origin https://${{ secrets.GITHUB_USERNAME }}:${{ secrets.GITHUB_REPO_TOKEN }}@github.com/fastify/benchmarks
git push
1 change: 0 additions & 1 deletion .gitignore
Expand Up @@ -56,4 +56,3 @@ yarn.lock
package-lock.json

# benchmark results
results
118 changes: 67 additions & 51 deletions benchmark-bench.js
@@ -1,12 +1,75 @@
#!/usr/bin/env node
'use strict'

const inquirer = require('inquirer')
const bench = require('./lib/bench')
const { choices, list } = require('./lib/packages')
const argv = process.argv.slice(2)

function select (callback) {
inquirer.prompt([
run().catch(err => {
console.error(err)
process.exit(1)
})

async function run () {
const options = await getBenchmarkOptions()
const modules = options.all ? choices : await select(list)
return bench(options, modules)
}

async function getBenchmarkOptions () {
if (argv.length) return parseArgv()
return inquirer.prompt([
{
type: 'confirm',
name: 'all',
message: 'Do you want to run all benchmark tests?',
default: false
},
{
type: 'input',
name: 'connections',
message: 'How many connections do you need?',
default: 100,
validate (value) {
return !Number.isNaN(parseFloat(value)) || 'Please enter a number'
},
filter: Number
},
{
type: 'input',
name: 'pipelining',
message: 'How many pipelines do you need?',
default: 10,
validate (value) {
return !Number.isNaN(parseFloat(value)) || 'Please enter a number'
},
filter: Number
},
{
type: 'input',
name: 'duration',
message: 'How long should it take?',
default: 40,
validate (value) {
return !Number.isNaN(parseFloat(value)) || 'Please enter a number'
},
filter: Number
}
])
}

function parseArgv () {
const [all, connections, pipelining, duration] = argv
return {
all: all === 'y',
connections: +connections,
pipelining: +pipelining,
duration: +duration
}
}

async function select () {
const result = await inquirer.prompt([
{
type: 'checkbox',
message: 'Select packages',
Expand All @@ -25,52 +88,5 @@ function select (callback) {
}
}
])
.then(function (answers) {
callback(answers.list)
})
return result.list
}

inquirer.prompt([
{
type: 'confirm',
name: 'all',
message: 'Do you want to run all benchmark tests?',
default: false
},
{
type: 'input',
name: 'connections',
message: 'How many connections do you need?',
default: 100,
validate (value) {
return !Number.isNaN(parseFloat(value)) || 'Please enter a number'
},
filter: Number
},
{
type: 'input',
name: 'pipelining',
message: 'How many pipelines do you need?',
default: 10,
validate (value) {
return !Number.isNaN(parseFloat(value)) || 'Please enter a number'
},
filter: Number
},
{
type: 'input',
name: 'duration',
message: 'How long should it take?',
default: 40,
validate (value) {
return !Number.isNaN(parseFloat(value)) || 'Please enter a number'
},
filter: Number
}
]).then((opts) => {
if (!opts.all) {
select(list => bench(opts, list))
} else {
bench(opts, choices)
}
})
2 changes: 1 addition & 1 deletion benchmark-compare.js
Expand Up @@ -51,7 +51,7 @@ if (!choices.length) {
head: ['', 'Router', 'Requests/s', 'Latency', 'Throughput/Mb']
})
if (commander.commandlineMdTable) {
table.push([':--', '--:', ':-:', '--:', '--:', '--:'])
table.push([':--', '--:', ':-:', '--:', '--:'])
}

choices.forEach((result) => {
Expand Down

0 comments on commit 815a4a1

Please sign in to comment.