diff --git a/README.md b/README.md index aa4dcd16..e50994b0 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,17 @@ The following code will only cause a single DOM manipulation: ``` + +## Benchmarks + +The `/bench` directory includes a number of performance benchmarks. + +To run in `node`: + +```bash +yarn ember build +node ./bench/index.js # (all benchmarks) +node ./bench/index.js ./bench/benches/some-file.js # (specific benchmark) +``` + +Or to run in a browser, run `yarn ember server`, and visit `http://localhost:4200` in a browser. Be aware that having the developer tools open/closed can affect JS performance. diff --git a/bench/benches/debounce-cancel.js b/bench/benches/debounce-cancel.js index b473fe0c..f1bed807 100644 --- a/bench/benches/debounce-cancel.js +++ b/bench/benches/debounce-cancel.js @@ -1,5 +1,3 @@ -var Backburner = require('../../dist/backburner').default; - function sharedSetup() { var backburner = new this.Backburner(["sync", "actions", "routerTransitions", "render", "afterRender", "destroy", "rsvpAfter"]); diff --git a/bench/benches/later-cancel.js b/bench/benches/later-cancel.js index bcab0bc3..55ad4180 100644 --- a/bench/benches/later-cancel.js +++ b/bench/benches/later-cancel.js @@ -1,5 +1,3 @@ -var Backburner = require('../../dist/backburner').default; - function sharedSetup() { var backburner = new this.Backburner(["sync", "actions", "routerTransitions", "render", "afterRender", "destroy", "rsvpAfter"]); diff --git a/bench/benches/schedule-cancel.js b/bench/benches/schedule-cancel.js index a331f957..50e71ec6 100644 --- a/bench/benches/schedule-cancel.js +++ b/bench/benches/schedule-cancel.js @@ -1,5 +1,3 @@ -var Backburner = require('../../dist/backburner').default; - function sharedSetup() { var backburner = new this.Backburner(["sync", "actions", "routerTransitions", "render", "afterRender", "destroy", "rsvpAfter"]); diff --git a/bench/benches/schedule-flush.js b/bench/benches/schedule-flush.js index f522213e..c7316fcd 100644 --- a/bench/benches/schedule-flush.js +++ b/bench/benches/schedule-flush.js @@ -1,5 +1,3 @@ -var Backburner = require('../../dist/backburner').default; - function prodSetup() { var backburner = new this.Backburner(["sync", "actions", "routerTransitions", "render", "afterRender", "destroy", "rsvpAfter"]); diff --git a/bench/benches/throttle-cancel.js b/bench/benches/throttle-cancel.js index 2ab953fc..5c45f28b 100644 --- a/bench/benches/throttle-cancel.js +++ b/bench/benches/throttle-cancel.js @@ -1,5 +1,3 @@ -var Backburner = require('../../dist/backburner').default; - function sharedSetup() { var backburner = new this.Backburner(["sync", "actions", "routerTransitions", "render", "afterRender", "destroy", "rsvpAfter"]); diff --git a/bench/browser-bench.js b/bench/browser-bench.js new file mode 100644 index 00000000..75da6cf3 --- /dev/null +++ b/bench/browser-bench.js @@ -0,0 +1,29 @@ +import bench from "do-you-even-bench"; +import Benchmark from "benchmark"; +window.Benchmark = Benchmark; + +import DebounceCancel from "./benches/debounce-cancel"; +import LaterCancel from "./benches/later-cancel"; +import ScheduleCancel from "./benches/schedule-cancel"; +import ScheduleFlush from "./benches/schedule-flush"; +import ThrottleCancel from "./benches/throttle-cancel"; + +let suites = [ + DebounceCancel, + LaterCancel, + ScheduleCancel, + ScheduleFlush, + ThrottleCancel, +].flat(); + +const searchParams = new URLSearchParams(window.location.search); +const filter = searchParams.get("filter"); + +if (filter) { + document.querySelector("input[name=filter]").value = filter; + suites = suites.filter((s) => + s.name.toLowerCase().includes(filter.toLowerCase()) + ); +} + +bench(suites); diff --git a/bench/index.html b/bench/index.html new file mode 100644 index 00000000..298abf12 --- /dev/null +++ b/bench/index.html @@ -0,0 +1,25 @@ + + + + + Backburner.js Benchmarks + + +
+ + + +
+
+  
+ + + + + + + + diff --git a/bench/index.js b/bench/index.js index c8e71725..ac75a61c 100644 --- a/bench/index.js +++ b/bench/index.js @@ -15,6 +15,8 @@ if (process.argv[2]) { console.log(fileGlob); } +globalThis.Backburner = require("../dist/backburner").default; + var suites = []; glob.sync(fileGlob).forEach(function(file) { var exported = require( path.resolve( file ) ); diff --git a/ember-cli-build.js b/ember-cli-build.js index 78894dbf..7e1527cb 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -89,8 +89,8 @@ module.exports = function (app) { files: ['qunit.css', 'qunit.js'] }), new Funnel(path.dirname(require.resolve('loader.js')), { - annotation: 'tests/loader.js', - destDir: 'tests', + annotation: 'loader.js', + destDir: '', files: ['loader.js'] }), new Funnel(compiled, { @@ -108,7 +108,35 @@ module.exports = function (app) { new Funnel(__dirname + '/tests', { destDir: 'tests', files: ['index.html'] - }) + }), + new Funnel(__dirname + "/bench", { + destDir: "bench", + files: ["index.html"], + }), + new Rollup(__dirname + "/bench", { + rollup: { + treeshake: false, + input: "browser-bench.js", + external: ["backburner"], + plugins: [ + resolve(), + commonjs(), + loadWithInlineMap(), + ], + output: [ + { + file: "bench/browser-bench.js", + format: "amd", + amd: { id: "browser-bench" }, + sourcemap: true, + }, + ], + }, + }), + new Funnel(path.dirname(require.resolve("lodash")), { + destDir: "bench", + files: ["lodash.js"], + }), ], { annotation: 'dist' }); diff --git a/package.json b/package.json index 58fe344d..87c049d3 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "ember-cli-inject-live-reload": "2.0.2", "glob": "^7.1.6", "loader.js": "^4.7.0", + "lodash": "^4.17.21", "lolex": "^6.0.0", "qunit": "^2.14.1", "release-it": "^14.2.1", diff --git a/tests/index.html b/tests/index.html index 7d4f897f..ca4a00c3 100644 --- a/tests/index.html +++ b/tests/index.html @@ -12,7 +12,7 @@ - +