diff --git a/benchmark/popPush.ts b/benchmark/popPush.ts index 12d5523..665d3ac 100644 --- a/benchmark/popPush.ts +++ b/benchmark/popPush.ts @@ -1,47 +1,92 @@ import Benchmark from "benchmark"; import { BucketQueue } from "../src"; -import Heap from "heap-js"; +import HeapJS from "heap-js"; +import Heap from "heap"; +import { MinHeap as HeapDS } from "@datastructures-js/heap"; +import { PriorityQueue, MinPriorityQueue } from "priority-queue-typed"; -const suit = new Benchmark.Suite({ - initCount: 1000, -}); +const suit = new Benchmark.Suite(); -const rounds = 1_000_000; -const priorityMax = 1_000; +const itemNumber = 10_000_000; +const priorityMax = 1000; -const items: [string, number][] = []; +const items: number[] = []; -for (let i = 0; i < rounds; i++) { - items.push([`item-${i}`, i % priorityMax]); +for (let i = 0; i < itemNumber; i++) { + items.push(i % priorityMax); } -const bq = new BucketQueue(); -const heap = new Heap<[string, number]>((a, b) => a[1] - b[1]); +const bq = new BucketQueue(); +const heapjs = new HeapJS((a, b) => a - b); +const heap = new Heap((a, b) => a - b); +const heapds = new HeapDS(); +const mpq = new MinPriorityQueue(); +const pq = new PriorityQueue([], { comparator: (a, b) => a - b }); for (let i = 0; i < items.length; i++) { - bq.push(items[i][0], items[i][1]); + bq.push(items[i], items[i]); + heapjs.push(items[i]); heap.push(items[i]); + heapds.push(items[i]); + mpq.add(items[i]); + pq.add(items[i]); } suit .add("BucketQueue", () => { - const i1 = bq.popLowest() as string; - const i2 = bq.popLowest() as string; - const i3 = bq.popLowest() as string; + const i1 = bq.popLowest() as number; + const i2 = bq.popLowest() as number; + const i3 = bq.popLowest() as number; - bq.push(i3, 0); - bq.push(i2, 0); - bq.push(i1, 0); + bq.push(i3, i3); + bq.push(i2, i2); + bq.push(i1, i1); + }) + .add("HeapJS", () => { + const i1 = heapjs.pop() as number; + const i2 = heapjs.pop() as number; + const i3 = heapjs.pop() as number; + + heapjs.push(i3); + heapjs.push(i2); + heapjs.push(i1); + }) + .add("HeapDS", () => { + const i1 = heapds.pop() as number; + const i2 = heapds.pop() as number; + const i3 = heapds.pop() as number; + + heapds.push(i3); + heapds.push(i2); + heapds.push(i1); }) .add("Heap", () => { - const i1 = heap.pop() as [string, number]; - const i2 = heap.pop() as [string, number]; - const i3 = heap.pop() as [string, number]; + const i1 = heap.pop() as number; + const i2 = heap.pop() as number; + const i3 = heap.pop() as number; heap.push(i3); heap.push(i2); heap.push(i1); }) + .add("MinPriorityQueue", () => { + const i1 = mpq.poll() as number; + const i2 = mpq.poll() as number; + const i3 = mpq.poll() as number; + + mpq.add(i3); + mpq.add(i2); + mpq.add(i1); + }) + .add("PriorityQueue", () => { + const i1 = pq.poll() as number; + const i2 = pq.poll() as number; + const i3 = pq.poll() as number; + + pq.add(i3); + pq.add(i2); + pq.add(i1); + }) .on("cycle", function (e: Event) { console.log("" + e.target); }) diff --git a/package-lock.json b/package-lock.json index 8b4dd63..b5ee028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,28 @@ { "name": "bucket-priority-queue", - "version": "1.0.2", + "version": "1.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bucket-priority-queue", - "version": "1.0.2", + "version": "1.0.4", "license": "MIT", "devDependencies": { + "@datastructures-js/heap": "^4.3.2", "@types/benchmark": "^2.1.5", + "@types/heap": "^0.2.34", "@types/jest": "^29.5.11", "@typescript-eslint/eslint-plugin": "^6.16.0", "@typescript-eslint/parser": "^6.16.0", "benchmark": "^2.1.4", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", + "heap": "^0.2.7", "heap-js": "^2.3.0", "jest": "^29.7.0", "prettier": "^3.1.1", + "priority-queue-typed": "^1.50.1", "ts-jest": "^29.1.1", "ts-node": "^10.9.2", "tsup": "^8.0.1", @@ -700,6 +704,12 @@ "node": ">=12" } }, + "node_modules/@datastructures-js/heap": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@datastructures-js/heap/-/heap-4.3.2.tgz", + "integrity": "sha512-7/9QSsIZ+wMG3C9++mz9iOjdtTp9C036PISHvNjG3eyFO8nXOBJQFKgeV7M6/+EPl+oXXFRGBb8Ue60LsqTqGw==", + "dev": true + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.19.11", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", @@ -2046,6 +2056,12 @@ "@types/node": "*" } }, + "node_modules/@types/heap": { + "version": "0.2.34", + "resolved": "https://registry.npmjs.org/@types/heap/-/heap-0.2.34.tgz", + "integrity": "sha512-x9gp0NZnQeFrgrb6O3Tq5KtvsuEhWbc2vlHfs4cDOKcHsanzI39lIGcPdND/MRyaKUbxNgKXfKGCQGnjjOWweQ==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -3090,6 +3106,12 @@ "node": ">= 8" } }, + "node_modules/data-structure-typed": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/data-structure-typed/-/data-structure-typed-1.50.1.tgz", + "integrity": "sha512-fPohEwryw3fum9OYO+BtICDz6vjDBOaheusPd7oKl+GOEXew4ETXJ1+1Hs8kmKI0QaJUsRz1rREmdkfVq9tMOQ==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3956,6 +3978,12 @@ "node": ">= 0.4" } }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, "node_modules/heap-js": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/heap-js/-/heap-js-2.3.0.tgz", @@ -5645,6 +5673,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/priority-queue-typed": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/priority-queue-typed/-/priority-queue-typed-1.50.1.tgz", + "integrity": "sha512-eN4QnYjuqS4BNQyTSgCKGZ2tFZtkxS/3R/CSufhV0dtKMWn4Fs/IIcH0nLpq125AP2s67/Dfe3IqLXsmCzVnug==", + "dev": true, + "dependencies": { + "data-structure-typed": "^1.50.0" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", diff --git a/package.json b/package.json index dfa1c06..aa924ef 100644 --- a/package.json +++ b/package.json @@ -37,16 +37,20 @@ "homepage": "https://github.com/keriati/bucket-priority-queue", "license": "MIT", "devDependencies": { + "@datastructures-js/heap": "^4.3.2", "@types/benchmark": "^2.1.5", + "@types/heap": "^0.2.34", "@types/jest": "^29.5.11", "@typescript-eslint/eslint-plugin": "^6.16.0", "@typescript-eslint/parser": "^6.16.0", "benchmark": "^2.1.4", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", + "heap": "^0.2.7", "heap-js": "^2.3.0", "jest": "^29.7.0", "prettier": "^3.1.1", + "priority-queue-typed": "^1.50.1", "ts-jest": "^29.1.1", "ts-node": "^10.9.2", "tsup": "^8.0.1",