From a24f10f85b72381a94415fa39152f76b640745df Mon Sep 17 00:00:00 2001 From: H01001000 Date: Wed, 8 Mar 2023 19:46:08 -0800 Subject: [PATCH] chore: add benchmark --- .github/workflows/benchmark.yml | 25 ++++++++++++- .github/workflows/retryBenchmark.yml | 50 ++++---------------------- packages/benchmark/.swcrc | 24 +++++++++++++ packages/benchmark/package.json | 38 ++++++++++++++++++++ packages/benchmark/src/index.ts | 42 ++++++++++++++++++++++ packages/benchmark/tsconfig.json | 16 +++++++++ scripts/fixBenchExtension.js | 16 +++------ yarn.lock | 52 ++++++++++++++++++++++++++++ 8 files changed, 208 insertions(+), 55 deletions(-) create mode 100644 packages/benchmark/.swcrc create mode 100644 packages/benchmark/package.json create mode 100644 packages/benchmark/src/index.ts create mode 100644 packages/benchmark/tsconfig.json diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index a6e26fb5d..63a2cd091 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -16,4 +16,27 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - run: node ./scripts/checkCpuModel.js + - name: Check cpu model + run: node ./scripts/checkCpuModel.js + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + - uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - run: yarn install --immutable + - name: Build + run: yarn build + + # + - name: Download db from benchmark repo + run: wget https://github.com/discordeno/benchmarks/raw/main/db.tar.gz + - name: Decompress db + run: tar -xzvf db.tar.gz + + - name: Benchmark + run: node ./packages/benchmark/dist/index.js diff --git a/.github/workflows/retryBenchmark.yml b/.github/workflows/retryBenchmark.yml index 603e5fe06..7026807b2 100644 --- a/.github/workflows/retryBenchmark.yml +++ b/.github/workflows/retryBenchmark.yml @@ -1,4 +1,4 @@ -name: Benchmark +name: Benchmark with retry on: pull_request: @@ -6,65 +6,29 @@ on: jobs: benchmark-try-1: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - run: node ./scripts/checkCpuModel.js + uses: ./.github/workflows/benchmark.yml benchmark-try-2: needs: benchmark-try-1 if: ${{ always() && needs.benchmark-try-1.result == 'failure' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - run: node ./scripts/checkCpuModel.js + uses: ./.github/workflows/benchmark.yml benchmark-try-3: needs: benchmark-try-2 if: ${{ always() && needs.benchmark-try-2.result == 'failure' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - run: node ./scripts/checkCpuModel.js + uses: ./.github/workflows/benchmark.yml benchmark-try-4: needs: benchmark-try-3 if: ${{ always() && needs.benchmark-try-3.result == 'failure' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - run: node ./scripts/checkCpuModel.js + uses: ./.github/workflows/benchmark.yml benchmark-try-5: needs: benchmark-try-4 if: ${{ always() && needs.benchmark-try-4.result == 'failure' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - run: node ./scripts/checkCpuModel.js + uses: ./.github/workflows/benchmark.yml benchmark-try-6: needs: benchmark-try-5 if: ${{ always() && needs.benchmark-try-5.result == 'failure' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - run: node ./scripts/checkCpuModel.js + uses: ./.github/workflows/benchmark.yml diff --git a/packages/benchmark/.swcrc b/packages/benchmark/.swcrc new file mode 100644 index 000000000..0000defd2 --- /dev/null +++ b/packages/benchmark/.swcrc @@ -0,0 +1,24 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "decorators": true, + "dynamicImport": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, + "target": "es2022", + "keepClassNames": true, + "loose": true + }, + "module": { + "type": "es6", + "strict": false, + "strictMode": true, + "lazy": false, + "noInterop": false + }, + "sourceMaps": true +} diff --git a/packages/benchmark/package.json b/packages/benchmark/package.json new file mode 100644 index 000000000..8fe44c493 --- /dev/null +++ b/packages/benchmark/package.json @@ -0,0 +1,38 @@ +{ + "name": "benchmark", + "version": "0.0.0", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "type": "module", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/discordeno/discordeno.git" + }, + "scripts": { + "build:type": "tsc --declaration --emitDeclarationOnly --declarationDir dist", + "release-build": "yarn build && yarn build:type", + "fmt": "eslint --fix \"src/**/*.ts*\"", + "lint": "eslint \"src/**/*.ts*\"", + "build": "swc src --delete-dir-on-start --out-dir dist && node ../../scripts/fixBenchExtension.js", + "bench": "node dist/index.js" + }, + "dependencies": { + "@discordeno/gateway": "19.0.0-alpha.1", + "@discordeno/rest": "19.0.0-alpha.1", + "@discordeno/types": "19.0.0-alpha.1", + "@discordeno/utils": "19.0.0-alpha.1", + "benchmark": "^2.1.4" + }, + "devDependencies": { + "@swc/cli": "^0.1.57", + "@swc/core": "^1.3.21", + "@types/benchmark": "^2", + "@types/node": "^18.11.9", + "eslint": "^8.0.1", + "eslint-config-discordeno": "*", + "ts-node": "^10.9.1", + "tsconfig": "*", + "typescript": "^4.9.3" + } +} \ No newline at end of file diff --git a/packages/benchmark/src/index.ts b/packages/benchmark/src/index.ts new file mode 100644 index 000000000..066270dd7 --- /dev/null +++ b/packages/benchmark/src/index.ts @@ -0,0 +1,42 @@ +import { camelize, snakelize } from '@discordeno/utils' +import Benchmark from 'benchmark' +import fs from 'node:fs/promises' + +const events: any[] = [] +const camelizedEvents: any[] = [] + +const files = await fs.readdir('db/events') + +await Promise.all( + files.map(async (file) => { + const eventsInFile = Object.values(await fs.readFile(file, 'utf8').then((text) => JSON.parse(text))) + eventsInFile.forEach((eventInFile) => { + if (typeof eventInFile === 'string') return + events.push(eventInFile) + }) + }), +) + +events.forEach((event) => { + camelizedEvents.push(camelize(event)) +}) + +const suite = new Benchmark.Suite() + +suite.add(`Camelize ${events.length} events`, () => { + events.forEach((event) => { + camelize(event) + }) +}) + +suite.add(`Snakelize ${events.length} events`, () => { + camelizedEvents.forEach((event) => { + snakelize(event) + }) +}) + +suite + .on('cycle', function (event: any) { + console.log(String(event.target)) + }) + .run() diff --git a/packages/benchmark/tsconfig.json b/packages/benchmark/tsconfig.json new file mode 100644 index 000000000..50e6ef6eb --- /dev/null +++ b/packages/benchmark/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "tsconfig/base.json", + "compilerOptions": { + "outDir": "./dist", + }, + "include": [ + "./src/**/*.ts", + "./src/**/*.tsx" + ], + "exclude": [ + "node_modules", + "dist", + "test", + "tests" + ] +} \ No newline at end of file diff --git a/scripts/fixBenchExtension.js b/scripts/fixBenchExtension.js index 9f98f5fe4..68604c718 100644 --- a/scripts/fixBenchExtension.js +++ b/scripts/fixBenchExtension.js @@ -3,19 +3,13 @@ import fs from 'node:fs' const dirs = [''] for await (const dir of dirs) { await Promise.all( - fs.readdirSync(`benchDist${dir}`).map(async (file) => { - if (!file.endsWith('.js')) { + fs.readdirSync(`dist${dir}`).map(async (file) => { + if (!file.endsWith('.js') && !file.endsWith('.map') && !file.endsWith('.ts')) { dirs.push(`${dir}/${file}`) return } - const content = await fs.promises.readFile( - `benchDist${dir}/${file}`, - 'utf-8' - ) - fs.promises.writeFile( - `benchDist${dir}/${file}`, - content.replace(/src\//g, 'dist/').replace(/\.ts/g, '.js') - ) - }) + const content = await fs.promises.readFile(`dist${dir}/${file}`, 'utf-8') + fs.promises.writeFile(`dist${dir}/${file}`, content.replace(/src\//g, 'dist/').replace(/\.ts/g, '.js')) + }), ) } diff --git a/yarn.lock b/yarn.lock index 38ab1fa3d..638b92064 100644 --- a/yarn.lock +++ b/yarn.lock @@ -523,6 +523,13 @@ __metadata: languageName: node linkType: hard +"@types/benchmark@npm:^2": + version: 2.1.2 + resolution: "@types/benchmark@npm:2.1.2" + checksum: dc5e544ffca59bdc61008d89f007c14c281c17e80d50385da81eb9182e4466a9208ceb7af72ddfb4df1e2445ea35f2af36854168f698edd4c015a4262232462d + languageName: node + linkType: hard + "@types/chai-as-promised@npm:^7": version: 7.1.5 resolution: "@types/chai-as-promised@npm:7.1.5" @@ -981,6 +988,37 @@ __metadata: languageName: node linkType: hard +"benchmark@npm:^2.1.4": + version: 2.1.4 + resolution: "benchmark@npm:2.1.4" + dependencies: + lodash: ^4.17.4 + platform: ^1.3.3 + checksum: aa466561d4f2b0a2419a3069b8f90fd35ffacf26849697eea9de525ecfbd10b44da11070cc51c88d772076db8cb2415641b493de7d6c024fdf8551019c6fcf1c + languageName: node + linkType: hard + +"benchmark@workspace:packages/benchmark": + version: 0.0.0-use.local + resolution: "benchmark@workspace:packages/benchmark" + dependencies: + "@discordeno/gateway": 19.0.0-alpha.1 + "@discordeno/rest": 19.0.0-alpha.1 + "@discordeno/types": 19.0.0-alpha.1 + "@discordeno/utils": 19.0.0-alpha.1 + "@swc/cli": ^0.1.57 + "@swc/core": ^1.3.21 + "@types/benchmark": ^2 + "@types/node": ^18.11.9 + benchmark: ^2.1.4 + eslint: ^8.0.1 + eslint-config-discordeno: "*" + ts-node: ^10.9.1 + tsconfig: "*" + typescript: ^4.9.3 + languageName: unknown + linkType: soft + "bin-check@npm:^4.1.0": version: 4.1.0 resolution: "bin-check@npm:4.1.0" @@ -3483,6 +3521,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.4": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + "log-symbols@npm:4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" @@ -4286,6 +4331,13 @@ __metadata: languageName: node linkType: hard +"platform@npm:^1.3.3": + version: 1.3.6 + resolution: "platform@npm:1.3.6" + checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1"