Skip to content

Commit ca4089f

Browse files
authored
Use modern JavaScript syntax for benchmarks (#333)
1 parent 5d72c08 commit ca4089f

File tree

7 files changed

+91
-94
lines changed

7 files changed

+91
-94
lines changed

benchmarks/fixtures.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var fixtures = [
1+
const fixtures = [
22
{
33
description: 'strings',
44
args: ['one', 'two', 'three'],
@@ -26,4 +26,4 @@ var fixtures = [
2626
}
2727
];
2828

29-
module.exports = fixtures;
29+
export default fixtures;

benchmarks/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<title>Benchmarks</title>
66
</head>
77
<body>
8-
<div id="results"></div>
9-
<div id="loader">Wait please&hellip;</div>
10-
<script src="runInBrowser.bundle.js"></script>
8+
<button id="start" type="button" disabled>Start benchmarks</button>
9+
<pre id="results"></pre>
10+
<script type="module" src="./runInBrowser.bundle.js"></script>
1111
</body>
1212
</html>

benchmarks/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
{
22
"name": "classnames-benchmarks",
3+
"type": "module",
34
"scripts": {
45
"benchmarks": "node ./run.js",
5-
"benchmarks-browser": "rollup --plugin commonjs,json,node-resolve ./runInBrowser.js --file ./runInBrowser.bundle.js --format iife && http-server -o"
6+
"benchmarks-browser": "rollup --plugin commonjs,json,node-resolve ./runInBrowser.js --file ./runInBrowser.bundle.js && http-server -o -c-1"
67
},
78
"devDependencies": {
89
"@rollup/plugin-commonjs": "^25.0.7",

benchmarks/run.js

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
1-
var fixtures = require('./fixtures');
2-
var local = require('classnames-local');
3-
var dedupe = require('classnames-local/dedupe');
4-
var localPackage = require('classnames-local/package.json');
1+
import local from 'classnames-local';
2+
import dedupe from 'classnames-local/dedupe.js';
3+
import localPackage from 'classnames-local/package.json' with { type: 'json' };
54

6-
function log (message) {
7-
console.log(message);
8-
}
5+
import npm from 'classnames-npm';
6+
import npmDedupe from 'classnames-npm/dedupe.js';
7+
import npmPackage from 'classnames-npm/package.json' with { type: 'json' };
98

10-
try {
11-
var npm = require('classnames-npm');
12-
var npmDedupe = require('classnames-npm/dedupe');
13-
var npmPackage = require('classnames-npm/package.json');
14-
} catch (e) {
15-
log('There was an error loading the benchmark classnames package.\n' +
16-
'Please make sure you have run `npm install` in ./benchmarks\n');
17-
process.exit(0);
18-
}
9+
import fixtures from './fixtures.js';
10+
import runChecks from './runChecks.js';
11+
import runSuite from './runSuite.js';
1912

2013
if (localPackage.version !== npmPackage.version) {
21-
log('Your local version (' + localPackage.version + ') does not match the installed version (' + npmPackage.version + ')\n\n' +
14+
log(
15+
`Your local version (${localPackage.version} does not match the installed version (${npmPackage.version})\n\n` +
2216
'Please run `npm update classnames-npm` in ./benchmarks to ensure you are benchmarking\n' +
23-
'the latest version of this package.\n');
17+
'the latest version of this package.\n'
18+
);
2419
process.exit(0);
2520
}
2621

27-
var runChecks = require('./runChecks');
28-
var runSuite = require('./runSuite');
29-
30-
fixtures.forEach(function (f) {
22+
fixtures.forEach((f) => {
3123
runChecks(local, npm, dedupe, npmDedupe, f);
3224
runSuite(local, npm, dedupe, npmDedupe, f, log);
3325
});
26+
27+
function log (message) {
28+
console.log(message);
29+
}

benchmarks/runChecks.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
var assert = require('assert');
1+
import assert from 'node:assert/strict';
22

33
function sortClasses (str) {
44
return str.split(' ').sort().join(' ');
55
}
66

77
function runChecks (local, npm, dedupe, npmDedupe, fixture) {
8-
// sort assertions because dedupe returns results in a different order
9-
assert.equal(sortClasses(local.apply(null, fixture.args)), sortClasses(fixture.expected));
10-
assert.equal(sortClasses(dedupe.apply(null, fixture.args)), sortClasses(fixture.expected));
11-
assert.equal(sortClasses(npm.apply(null, fixture.args)), sortClasses(fixture.expected));
12-
assert.equal(sortClasses(npmDedupe.apply(null, fixture.args)), sortClasses(fixture.expected));
8+
// Sort assertions because 'dedupe' returns results in a different order.
9+
assert.equal(sortClasses(local(...fixture.args)), sortClasses(fixture.expected));
10+
assert.equal(sortClasses(dedupe(...fixture.args)), sortClasses(fixture.expected));
11+
assert.equal(sortClasses(npm(...fixture.args)), sortClasses(fixture.expected));
12+
assert.equal(sortClasses(npmDedupe(...fixture.args)), sortClasses(fixture.expected));
1313
}
1414

15-
module.exports = runChecks;
15+
export default runChecks;

benchmarks/runInBrowser.js

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,52 @@
1-
var fixtures = require('./fixtures');
2-
var local = require('classnames-local');
3-
var dedupe = require('classnames-local/dedupe');
4-
var localPackage = require('classnames-local/package.json');
1+
import local from 'classnames-local';
2+
import dedupe from 'classnames-local/dedupe.js';
3+
import localPackage from 'classnames-local/package.json' with { type: 'json' };
54

6-
var npm = require('classnames-npm');
7-
var npmDedupe = require('classnames-npm/dedupe');
8-
var npmPackage = require('classnames-npm/package.json');
5+
import npm from 'classnames-npm';
6+
import npmDedupe from 'classnames-npm/dedupe.js';
7+
import npmPackage from 'classnames-npm/package.json' with { type: 'json' };
98

10-
function log (message) {
11-
console.log(message);
12-
var results = document.getElementById('results');
13-
//noinspection InnerHTMLJS
14-
results.innerHTML += (message + '\n').replace(/\n/g, '<br/>');
15-
}
9+
import fixtures from './fixtures.js';
10+
import runSuite from './runSuite.js';
11+
12+
const startButton = document.getElementById('start');
13+
const results = document.getElementById('results');
1614

17-
if (localPackage.version !== npmPackage.version) {
18-
log('Your local version (' + localPackage.version + ') does not match the installed version (' + npmPackage.version + ')\n\n' +
15+
startButton.addEventListener('click', runBenchmarks);
16+
17+
if (localPackage.version === npmPackage.version) {
18+
startButton.disabled = false;
19+
} else {
20+
startButton.style.display = 'none';
21+
22+
log(
23+
`Your local version (${localPackage.version} does not match the installed version (${npmPackage.version})\n\n` +
1924
'Please run `npm update classnames-npm` in ./benchmarks to ensure you are benchmarking\n' +
20-
'the latest version of this package.\n');
21-
return;
25+
'the latest version of this package.\n'
26+
);
2227
}
2328

24-
function iterate (array, iterator, i, callback) {
25-
if (i >= 0 && i < array.length) {
26-
iterator(array[i], i, array);
27-
setTimeout(iterate.bind(null, array, iterator, i + 1, callback), 1);
28-
} else if (callback) {
29-
callback();
29+
async function runBenchmarks () {
30+
startButton.style.display = 'none';
31+
32+
log('Running benchmark…');
33+
log(navigator.userAgent);
34+
35+
await nextTick();
36+
37+
for (const fixture of fixtures) {
38+
runSuite(local, npm, dedupe, npmDedupe, fixture, log);
39+
await nextTick();
3040
}
31-
}
3241

33-
function deferredForEach (array, iterator, callback) {
34-
iterate(array, iterator, 0, callback);
42+
log('Finished!');
3543
}
3644

37-
var runSuite = require('./runSuite');
45+
function log (message) {
46+
console.log(message);
47+
results.textContent += `${message}\n`;
48+
}
3849

39-
window.onload = function () {
40-
//noinspection PlatformDetectionJS
41-
log(navigator.userAgent);
42-
setTimeout(function () {
43-
deferredForEach(fixtures, function (f) {
44-
runSuite(local, npm, dedupe, npmDedupe, f, log);
45-
}, function () {
46-
log('Finished');
47-
document.getElementById('loader').style.display = 'none';
48-
});
49-
}, 100);
50-
};
50+
function nextTick () {
51+
return new Promise((resolve) => setTimeout(resolve));
52+
}

benchmarks/runSuite.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,41 @@
1-
var benchmark = require('benchmark');
2-
var _ = require('lodash');
1+
import benchmark from 'benchmark';
2+
import _ from 'lodash';
33

4-
var Suite = benchmark.runInContext({ _ }).Suite;
4+
const { Suite } = benchmark.runInContext({ _ });
55

66
function runSuite (local, npm, dedupe, npmDedupe, fixture, log) {
7-
var suite = new Suite();
7+
const suite = new Suite();
88

9-
suite.add('local#' + fixture.description, function () {
10-
local.apply(null, fixture.args);
9+
suite.add(`local#${fixture.description}`, () => {
10+
local(...fixture.args);
1111
});
1212

13-
suite.add(' npm#' + fixture.description, function () {
14-
npm.apply(null, fixture.args);
13+
suite.add(` npm#${fixture.description}`, () => {
14+
npm(...fixture.args);
1515
});
1616

17-
suite.add('local/dedupe#' + fixture.description, function () {
18-
dedupe.apply(null, fixture.args);
17+
suite.add(`local/dedupe#${fixture.description}`, () => {
18+
dedupe(...fixture.args);
1919
});
2020

21-
suite.add(' npm/dedupe#' + fixture.description, function () {
22-
npmDedupe.apply(null, fixture.args);
21+
suite.add(` npm/dedupe#${fixture.description}`, () => {
22+
npmDedupe(...fixture.args);
2323
});
2424

25-
// after each cycle
26-
suite.on('cycle', function (event) {
27-
log('* ' + String(event.target));
25+
suite.on('cycle', (event) => {
26+
log(`* ${event.target}`);
2827
});
2928

30-
// other handling
31-
suite.on('complete', function () {
32-
log('\n> Fastest is' + (' ' + this.filter('fastest').map(result => result.name).join(' | ')).replace(/\s+/, ' ') + '\n');
29+
suite.on('complete', () => {
30+
log(`\n> Fastest is ${(suite.filter('fastest').map(result => result.name).join(' | ')).replace(/\s+/, ' ')}\n`);
3331
});
3432

35-
suite.on('error', function (event) {
33+
suite.on('error', (event) => {
3634
log(event.target.error.message);
3735
throw event.target.error;
3836
});
3937

4038
suite.run();
4139
}
4240

43-
module.exports = runSuite;
41+
export default runSuite;

0 commit comments

Comments
 (0)