Skip to content

Commit

Permalink
test: add examples and run them in the ci
Browse files Browse the repository at this point in the history
  • Loading branch information
adriencaccia committed Jun 22, 2023
1 parent fd88ad5 commit 0961143
Show file tree
Hide file tree
Showing 42 changed files with 3,321 additions and 5,445 deletions.
34 changes: 29 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,40 @@ jobs:
with:
run: pnpm moon run :bench

list-examples:
runs-on: "ubuntu-latest"
name: List examples
outputs:
examples: ${{ steps.list-examples.outputs.examples }}
steps:
- uses: "actions/checkout@v3"
# list the directories in ./examples and output them to a github action workflow variables as a JSON array
- run: |
examples=$(find ./examples -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | jq -R -s -c 'split("\n") | map(select(length > 0))')
echo "::set-output name=examples::$examples"
id: list-examples
node-versions:
runs-on: "ubuntu-latest"
name: "Node ${{ matrix.node-version }}"
name: "${{ matrix.example }} on Node ${{ matrix.node-version }}"
needs: list-examples
strategy:
matrix:
node-version: ["14", "16", "18", "20"]
example: ${{ fromJson(needs.list-examples.outputs.examples) }}
include:
# tinybench does not support node 14
- node-version: "14"
pnpm-version: "7"
skip-tinybench: true
exclude:
# esbuild-register does not work well with node 14
- node-version: "14"
example: with-typescript-cjs
- node-version: "14"
example: with-typescript-esm
- node-version: "14"
example: with-typescript-simple-esm
fail-fast: false
steps:
- uses: "actions/checkout@v3"
Expand All @@ -66,16 +90,16 @@ jobs:
- run: pnpm install --frozen-lockfile --prefer-offline
- run: pnpm moon run :build

- name: Run benchmarks on tinybench-plugin
- name: Run benchmarks with tinybench-plugin
if: matrix.skip-tinybench != true
uses: CodSpeedHQ/action@feat/node-script
with:
run: pnpm moon run tinybench-plugin:bench
run: pnpm --filter ${{ matrix.example }} bench-tinybench
env:
SKIP_UPLOAD: true
- name: Run benchmarks on benchmark.js-plugin
- name: Run benchmarks with benchmark.js-plugin
uses: CodSpeedHQ/action@feat/node-script
with:
run: pnpm moon run benchmark.js-plugin:bench
run: pnpm --filter ${{ matrix.example }} bench-benchmark-js
env:
SKIP_UPLOAD: true
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
auto-install-peers=true
18 changes: 18 additions & 0 deletions examples/with-javascript-cjs/benchmark-js.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const { withCodSpeed } = require("@codspeed/benchmark.js-plugin");
const Benchmark = require("benchmark");

const suite = withCodSpeed(new Benchmark.Suite());

suite
.add("RegExp#test", function () {
/o/.test("Hello World!");
})
.add("String#indexOf", function () {
"Hello World!".indexOf("o") > -1;
})
// add listeners
.on("cycle", function (event) {
console.log(String(event.target));
})
// run async
.run({ async: true });
14 changes: 14 additions & 0 deletions examples/with-javascript-cjs/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "with-javascript-cjs",
"private": true,
"scripts": {
"bench-benchmark-js": "node benchmark-js.js",
"bench-tinybench": "node tinybench.js"
},
"devDependencies": {
"@codspeed/benchmark.js-plugin": "workspace:^1.1.0",
"@codspeed/tinybench-plugin": "workspace:^1.1.0",
"benchmark": "^2.1.4",
"tinybench": "^2.5.0"
}
}
30 changes: 30 additions & 0 deletions examples/with-javascript-cjs/tinybench.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const { withCodSpeed } = require("@codspeed/tinybench-plugin");
const { Bench } = require("tinybench");

const bench = withCodSpeed(new Bench({ time: 100 }));

bench
.add("switch 1", () => {
let a = 1;
let b = 2;
const c = a;
a = b;
b = c;
})
.add("switch 2", () => {
let a = 1;
let b = 10;
a = b + a;
b = a - b;
a = b - a;
});

bench.run().then(() => {
console.table(
bench.tasks.map(({ name, result }) => ({
"Task Name": name,
"Average Time (ps)": result?.mean ? result.mean * 1000 : "N/A",
"Variance (ps)": result?.variance ? result.variance * 1000 : "N/A",
}))
);
});
18 changes: 18 additions & 0 deletions examples/with-javascript-esm/benchmark-js.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { withCodSpeed } from "@codspeed/benchmark.js-plugin";
import Benchmark from "benchmark";

const suite = withCodSpeed(new Benchmark.Suite());

suite
.add("RegExp#test", function () {
/o/.test("Hello World!");
})
.add("String#indexOf", function () {
"Hello World!".indexOf("o") > -1;
})
// add listeners
.on("cycle", function (event) {
console.log(String(event.target));
})
// run async
.run({ async: true });
15 changes: 15 additions & 0 deletions examples/with-javascript-esm/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "with-javascript-esm",
"private": true,
"type": "module",
"scripts": {
"bench-benchmark-js": "node benchmark-js.js",
"bench-tinybench": "node tinybench.js"
},
"devDependencies": {
"@codspeed/benchmark.js-plugin": "workspace:^1.1.0",
"@codspeed/tinybench-plugin": "workspace:^1.1.0",
"benchmark": "^2.1.4",
"tinybench": "^2.5.0"
}
}
30 changes: 30 additions & 0 deletions examples/with-javascript-esm/tinybench.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { withCodSpeed } from "@codspeed/tinybench-plugin";
import { Bench } from "tinybench";

const bench = withCodSpeed(new Bench({ time: 100 }));

bench
.add("switch 1", () => {
let a = 1;
let b = 2;
const c = a;
a = b;
b = c;
})
.add("switch 2", () => {
let a = 1;
let b = 10;
a = b + a;
b = a - b;
a = b - a;
});

bench.run().then(() => {
console.table(
bench.tasks.map(({ name, result }) => ({
"Task Name": name,
"Average Time (ps)": result?.mean ? result.mean * 1000 : "N/A",
"Variance (ps)": result?.variance ? result.variance * 1000 : "N/A",
}))
);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { branching_confusion } from "../../src/branchingConfusion";
import { suite } from "./index.bench";

suite.add("test branching confusion", () => {
branching_confusion();
});
33 changes: 33 additions & 0 deletions examples/with-typescript-cjs/bench/benchmark.js/fibo.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import {
iterativeFibonacci,
recursiveCachedFibonacci,
recursiveFibonacci,
} from "../../src/fibonacci";
import { suite } from "./index.bench";

suite
.add("test_recursive_fibo_10", () => {
recursiveFibonacci(10);
})
.add("test_recursive_fibo_20", () => {
recursiveFibonacci(20);
});

suite
.add("test_recursive_cached_fibo_10", () => {
recursiveCachedFibonacci(10);
})
.add("test_recursive_cached_fibo_20", () => {
recursiveCachedFibonacci(20);
})
.add("test_recursive_cached_fibo_30", () => {
recursiveCachedFibonacci(30);
});

suite
.add("test_iterative_fibo_10", () => {
iterativeFibonacci(10);
})
.add("test_iterative_fibo_100", () => {
iterativeFibonacci(100);
});
18 changes: 18 additions & 0 deletions examples/with-typescript-cjs/bench/benchmark.js/foobarbaz.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { aBaz, baz } from "../../src/foobarbaz";
import { suite } from "./index.bench";

suite
.add("test sync baz 10", () => {
baz(10);
})
.add("test sync baz 100", () => {
baz(100);
});

suite
.add("test async baz 10", async () => {
await aBaz(10);
})
.add("test async baz 100", async () => {
await aBaz(100);
});
16 changes: 16 additions & 0 deletions examples/with-typescript-cjs/bench/benchmark.js/index.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { withCodSpeed } from "@codspeed/benchmark.js-plugin";
import Benchmark from "benchmark";

export const suite = withCodSpeed(new Benchmark.Suite());

(async () => {
await import("./fibo.bench.ts");
await import("./foobarbaz.bench.ts");
await import("./branchingConfusion.bench.ts");

suite.on("cycle", function (event: Benchmark.Event) {
console.log(String(event.target));
});

await suite.run({ async: true });
})();
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { branching_confusion } from "../../src/branchingConfusion";
import { bench } from "./index.bench";

bench.add("test branching confusion", () => {
branching_confusion();
});
33 changes: 33 additions & 0 deletions examples/with-typescript-cjs/bench/tinybench/fibo.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import {
iterativeFibonacci,
recursiveCachedFibonacci,
recursiveFibonacci,
} from "../../src/fibonacci";
import { bench } from "./index.bench";

bench
.add("test_recursive_fibo_10", () => {
recursiveFibonacci(10);
})
.add("test_recursive_fibo_20", () => {
recursiveFibonacci(20);
});

bench
.add("test_recursive_cached_fibo_10", () => {
recursiveCachedFibonacci(10);
})
.add("test_recursive_cached_fibo_20", () => {
recursiveCachedFibonacci(20);
})
.add("test_recursive_cached_fibo_30", () => {
recursiveCachedFibonacci(30);
});

bench
.add("test_iterative_fibo_10", () => {
iterativeFibonacci(10);
})
.add("test_iterative_fibo_100", () => {
iterativeFibonacci(100);
});
18 changes: 18 additions & 0 deletions examples/with-typescript-cjs/bench/tinybench/foobarbaz.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { aBaz, baz } from "../../src/foobarbaz";
import { bench } from "./index.bench";

bench
.add("test sync baz 10", () => {
baz(10);
})
.add("test sync baz 100", () => {
baz(100);
});

bench
.add("test async baz 10", async () => {
await aBaz(10);
})
.add("test async baz 100", async () => {
await aBaz(100);
});
19 changes: 19 additions & 0 deletions examples/with-typescript-cjs/bench/tinybench/index.bench.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { withCodSpeed } from "@codspeed/tinybench-plugin";
import { Bench } from "tinybench";

export const bench = withCodSpeed(new Bench());

(async () => {
await import("./fibo.bench.ts");
await import("./foobarbaz.bench.ts");
await import("./branchingConfusion.bench.ts");

await bench.run();
console.table(
bench.tasks.map(({ name, result }) => ({
"Task Name": name,
"Average Time (ps)": result?.mean ? result.mean * 1000 : "N/A",
"Variance (ps)": result?.variance ? result.variance * 1000 : "N/A",
}))
);
})();
16 changes: 16 additions & 0 deletions examples/with-typescript-cjs/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "with-typescript-cjs",
"private": true,
"scripts": {
"bench-benchmark-js": "node --loader esbuild-register/loader -r esbuild-register bench/benchmark.js/index.bench.ts",
"bench-tinybench": "node --loader esbuild-register/loader -r esbuild-register bench/tinybench/index.bench.ts"
},
"devDependencies": {
"@codspeed/benchmark.js-plugin": "workspace:^1.1.0",
"@codspeed/tinybench-plugin": "workspace:^1.1.0",
"@types/benchmark": "^2.1.2",
"benchmark": "^2.1.4",
"tinybench": "^2.5.0",
"typescript": "^5.1.3"
}
}
28 changes: 28 additions & 0 deletions examples/with-typescript-cjs/src/branchingConfusion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
export function branching_confusion() {
lazy_worker();
hard_worker();
}

function lazy_worker() {
maybe_work(false);
}

function hard_worker() {
maybe_work(true);
}

function maybe_work(should_work: boolean) {
if (should_work) {
work();
}
return;
}

function work() {
let result = 0;
for (let i = 0; i < 1000; i++) {
result += 1;
}

return result;
}
Loading

0 comments on commit 0961143

Please sign in to comment.