diff --git a/README.md b/README.md index c550e2ec..ea80c9f3 100644 --- a/README.md +++ b/README.md @@ -363,6 +363,17 @@ import { v4 as uuidv4 } from 'uuid'; Workers](https://caniuse.com/#feat=cryptography) and we are not aware of a polyfill (let us know if you find one, please). +## Developing + +We happily accept pull requests! + +If you do considerable changes please [run the benchmark](./examples/benchmark/) before and after +your changes and include the results in the pull request description: + +``` +npm run test:benchmark +``` + ## Upgrading From uuid\@7 ### Only Named Exports Supported When Using with Node.js ESM diff --git a/README_js.md b/README_js.md index b0442aa0..b20f5601 100644 --- a/README_js.md +++ b/README_js.md @@ -353,6 +353,17 @@ import { v4 as uuidv4 } from 'uuid'; Workers](https://caniuse.com/#feat=cryptography) and we are not aware of a polyfill (let us know if you find one, please). +## Developing + +We happily accept pull requests! + +If you do considerable changes please [run the benchmark](./examples/benchmark/) before and after +your changes and include the results in the pull request description: + +``` +npm run test:benchmark +``` + ## Upgrading From uuid\@7 ### Only Named Exports Supported When Using with Node.js ESM diff --git a/examples/benchmark/README.md b/examples/benchmark/README.md new file mode 100644 index 00000000..a6d61e2e --- /dev/null +++ b/examples/benchmark/README.md @@ -0,0 +1,24 @@ +# uuid Benchmark + +``` +npm install +npm test +``` + +To run the benchmark in the browser open `benchmark.html` and check the console. + +Example output (`uuid@8.0.0`, MacBook Pro (Retina, 13-inch, Early 2015), 3.1 GHz Dual-Core Intel Core i7): + +``` +uuidv1() x 1,329,774 ops/sec ±1.67% (87 runs sampled) +uuidv1() fill existing array x 3,568,608 ops/sec ±1.67% (89 runs sampled) +uuidv4() x 305,160 ops/sec ±1.86% (85 runs sampled) +uuidv4() fill existing array x 352,852 ops/sec ±1.92% (85 runs sampled) +uuidv3() DNS x 115,482 ops/sec ±1.55% (80 runs sampled) +uuidv3() URL x 103,127 ops/sec ±1.49% (81 runs sampled) +uuidv3() MY_NAMESPACE x 107,009 ops/sec ±1.59% (80 runs sampled) +uuidv5() DNS x 113,219 ops/sec ±1.66% (82 runs sampled) +uuidv5() URL x 100,618 ops/sec ±4.13% (81 runs sampled) +uuidv5() MY_NAMESPACE x 95,596 ops/sec ±4.24% (74 runs sampled) +Fastest is uuidv1() fill existing array +``` diff --git a/examples/benchmark/benchmark.html b/examples/benchmark/benchmark.html new file mode 100644 index 00000000..2fc6b457 --- /dev/null +++ b/examples/benchmark/benchmark.html @@ -0,0 +1,10 @@ + +UUID UMD benchmark +

Please open the Developer Console to view output

+ + + + + + + diff --git a/examples/benchmark/benchmark.js b/examples/benchmark/benchmark.js new file mode 100644 index 00000000..fccec16d --- /dev/null +++ b/examples/benchmark/benchmark.js @@ -0,0 +1,62 @@ +/* global Benchmark:false, uuidv1:false, uuidv3:false, uuidv4:false, uuidv5:false */ +const Benchmark = (typeof window !== 'undefined' && window.Benchmark) || require('benchmark'); +const uuidv1 = (typeof window !== 'undefined' && window.uuidv1) || require('uuid').v1; +const uuidv4 = (typeof window !== 'undefined' && window.uuidv4) || require('uuid').v4; +const uuidv3 = (typeof window !== 'undefined' && window.uuidv3) || require('uuid').v3; +const uuidv5 = (typeof window !== 'undefined' && window.uuidv5) || require('uuid').v5; + +const MY_NAMESPACE = '55238d15-c926-4598-b49d-cf4e913ba13c'; + +const suite = new Benchmark.Suite(); +suite + .add('uuidv1()', function () { + uuidv1(); + }) + .add('uuidv1() fill existing array', function () { + const array = new Array(); + uuidv1(null, array, 0); + }) + .add('uuidv4()', function () { + uuidv4(); + }) + .add('uuidv4() fill existing array', function () { + const array = new Array(); + uuidv4(null, array, 0); + }) + .add('uuidv3() DNS', function () { + uuidv3('hello.example.com', uuidv3.DNS); + }) + .add('uuidv3() URL', function () { + // ... using predefined URL namespace (for, well, URLs) + uuidv3('http://example.com/hello', uuidv3.URL); + }) + .add('uuidv3() MY_NAMESPACE', function () { + // ... using a custom namespace + // + // Note: Custom namespaces should be a UUID string specific to your application! + // E.g. the one here was generated using this modules `uuid` CLI. + uuidv3('Hello, World!', MY_NAMESPACE); + }) + .add('uuidv5() DNS', function () { + // ... using predefined DNS namespace (for domain names) + uuidv5('hello.example.com', uuidv5.DNS); + }) + .add('uuidv5() URL', function () { + // ... using predefined URL namespace (for, well, URLs) + uuidv5('http://example.com/hello', uuidv5.URL); + }) + .add('uuidv5() MY_NAMESPACE', function () { + // ... using a custom namespace + // + // Note: Custom namespaces should be a UUID string specific to your application! + // E.g. the one here was generated using this modules `uuid` CLI. + // const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; + uuidv5('Hello, World!', MY_NAMESPACE); + }) + .on('cycle', function (event) { + console.log(String(event.target)); + }) + .on('complete', function () { + console.log('Fastest is ' + this.filter('fastest').map('name')); + }) + .run({ async: true }); diff --git a/examples/benchmark/package-lock.json b/examples/benchmark/package-lock.json new file mode 100644 index 00000000..b8c33171 --- /dev/null +++ b/examples/benchmark/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "uuid-benchmark", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", + "dev": true + }, + "uuid": { + "version": "file:../../.local" + } + } +} diff --git a/examples/benchmark/package.json b/examples/benchmark/package.json new file mode 100644 index 00000000..0d2ee0ee --- /dev/null +++ b/examples/benchmark/package.json @@ -0,0 +1,14 @@ +{ + "name": "uuid-benchmark", + "version": "0.0.0", + "private": true, + "scripts": { + "test": "node benchmark.js" + }, + "dependencies": { + "uuid": "file:../../.local" + }, + "devDependencies": { + "benchmark": "^2.1.4" + } +} diff --git a/package.json b/package.json index ee5e0791..a3be3513 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,8 @@ "pretest:node": "npm run build", "test:node": "npm-run-all --parallel examples:node:**", "test:pack": "./scripts/testpack.sh", + "pretest:benchmark": "npm run build", + "test:benchmark": "cd examples/benchmark && npm install && npm test", "prettier:check": "prettier --ignore-path .prettierignore --check '**/*.{js,jsx,json,md}'", "prettier:fix": "prettier --ignore-path .prettierignore --write '**/*.{js,jsx,json,md}'", "bundlewatch": "npm run pretest:browser && bundlewatch --config bundlewatch.config.json",