diff --git a/benchmark/lib/index.js b/benchmark/lib/index.js index a5d9e2cfe4..fd811fb592 100644 --- a/benchmark/lib/index.js +++ b/benchmark/lib/index.js @@ -31,7 +31,6 @@ async function getName() { .parseSync().name; } - const runnerPath = fileURLToPath(new URL('runner.js', import.meta.url)), path = new URL(`${await getName()}/`, import.meta.url), metadata = await import(new URL('index.js', path)); diff --git a/benchmark/lib/runner.js b/benchmark/lib/runner.js index 51928d0b66..9a38bb8b86 100644 --- a/benchmark/lib/runner.js +++ b/benchmark/lib/runner.js @@ -1,6 +1,8 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import { basename } from 'path'; +import * as hdr from 'hdr-histogram-js'; +hdr.initWebAssemblySync(); const { path, times, concurrency } = yargs(hideBin(process.argv)) .option('path', { @@ -39,26 +41,31 @@ const [ { benchmark, teardown }, metadata ] = await Promise.all([ async function run(times) { return new Promise(resolve => { + const histogram = hdr.build({ useWebAssembly: true }); let num = 0, inProgress = 0; function run() { ++inProgress; ++num; + + const start = process.hrtime.bigint(); benchmark(metadata) .catch(err => console.error(err)) .finally(() => { + histogram.recordValue(Number(process.hrtime.bigint() - start)); --inProgress; if (num < times) { run(); } else if (inProgress === 0) { - resolve(); + resolve(histogram); } }); } - for (let i = 0; i < concurrency; i++) { + const toInitiate = Math.min(concurrency, times); + for (let i = 0; i < toInitiate; i++) { run(); } }); @@ -68,9 +75,8 @@ async function run(times) { await run(Math.min(times * 0.1, 10_000)); // benchmark -const start = process.hrtime.bigint(); -await run(times); -const took = (process.hrtime.bigint() - start); -console.log(`[${basename(path)}]: took ${took / 1_000_000n}ms, ${took / BigInt(times)}ns per operation`); +const histogram = await run(times); +console.log(`[${basename(path)}]:`); +console.table(histogram.toJSON()); await teardown(); diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json index d3610f42e4..af72486e0a 100644 --- a/benchmark/package-lock.json +++ b/benchmark/package-lock.json @@ -8,7 +8,7 @@ "dependencies": { "@node-redis/client-local": "../packages/client", "@node-redis/client-production": "npm:@node-redis/client@1.0.0", - "hazelcast-client": "^5.0.2", + "hdr-histogram-js": "^2.0.1", "ioredis": "4.28.1", "redis-v3": "npm:redis@3.1.2", "yargs": "17.3.0" @@ -26,7 +26,6 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@node-redis/benchmark": "*", "@node-redis/test-utils": "*", "@types/node": "^16.11.10", "@types/redis-parser": "^3.0.0", @@ -49,6 +48,11 @@ "node": ">=12" } }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" + }, "node_modules/@node-redis/client-local": { "resolved": "../packages/client", "link": true @@ -68,11 +72,6 @@ "node": ">=12" } }, - "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -95,6 +94,25 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -182,16 +200,14 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/hazelcast-client": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hazelcast-client/-/hazelcast-client-5.0.2.tgz", - "integrity": "sha512-CsNvZZn2bQn8E+j5HgXzhhEfjliBn6626qBb5upcIQHw1J9rtobiS2/pqabNKXMwKjyzVNc/ui+yqFKaGMrc6A==", + "node_modules/hdr-histogram-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz", + "integrity": "sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==", "dependencies": { - "@types/long": "4.0.1", - "long": "4.0.0" - }, - "engines": { - "node": ">=10.4.0" + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" } }, "node_modules/ioredis": { @@ -242,11 +258,6 @@ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -260,6 +271,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -396,11 +412,15 @@ } }, "dependencies": { + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" + }, "@node-redis/client-local": { "version": "file:../packages/client", "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@node-redis/benchmark": "*", "@node-redis/test-utils": "*", "@types/node": "^16.11.10", "@types/redis-parser": "^3.0.0", @@ -435,11 +455,6 @@ "yallist": "4.0.0" } }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -453,6 +468,11 @@ "color-convert": "^2.0.1" } }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -514,13 +534,14 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "hazelcast-client": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hazelcast-client/-/hazelcast-client-5.0.2.tgz", - "integrity": "sha512-CsNvZZn2bQn8E+j5HgXzhhEfjliBn6626qBb5upcIQHw1J9rtobiS2/pqabNKXMwKjyzVNc/ui+yqFKaGMrc6A==", + "hdr-histogram-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz", + "integrity": "sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==", "requires": { - "@types/long": "4.0.1", - "long": "4.0.0" + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" } }, "ioredis": { @@ -561,11 +582,6 @@ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -576,6 +592,11 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", diff --git a/benchmark/package.json b/benchmark/package.json index 4964cc60ec..a4752b8833 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -9,7 +9,7 @@ "dependencies": { "@node-redis/client-local": "../packages/client", "@node-redis/client-production": "npm:@node-redis/client@1.0.0", - "hazelcast-client": "^5.0.2", + "hdr-histogram-js": "2.0.1", "ioredis": "4.28.1", "redis-v3": "npm:redis@3.1.2", "yargs": "17.3.0" diff --git a/benchmark/requirements.txt b/benchmark/requirements.txt new file mode 100644 index 0000000000..abff11d6ab --- /dev/null +++ b/benchmark/requirements.txt @@ -0,0 +1 @@ +redisbench_admin>=0.5.24