Skip to content

Commit e24595a

Browse files
authored
Merge pull request #4 from shadowcodex/queues
Queues
2 parents e5a3eff + f2c9036 commit e24595a

File tree

14 files changed

+934
-458
lines changed

14 files changed

+934
-458
lines changed

.vscode/settings.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"prettier.printWidth": 120,
3+
"prettier.singleQuote": true,
4+
"prettier.trailingComma": "es5",
5+
"editor.formatOnSave": true
6+
}

benchmark/README.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Benchmarks
2+
3+
These are custom ran benchmarks testing implementations timing on insertion, deletion, and data fetching.
4+
5+
## Stacks
6+
7+
```csharp
8+
┌──────────────────┬────────────────────┬─────────────────────┐
9+
Stack Operation100,000 items1,000,000 items
10+
├──────────────────┼────────────────────┼─────────────────────┤
11+
LinkedStack Push+ 0s 15ms 701111ns+ 0s 103ms 578697ns
12+
├──────────────────┼────────────────────┼─────────────────────┤
13+
UArrayStack Push+ 0s 33ms 674506ns+ 0s 44ms 682102ns
14+
├──────────────────┼────────────────────┼─────────────────────┤
15+
BArrayStack Push+ 0s 3ms 318560ns+ 0s 13ms 455307ns
16+
├──────────────────┼────────────────────┼─────────────────────┤
17+
LinkedStack Top+ 0s 2ms 589174ns+ 0s 16ms 513144ns
18+
├──────────────────┼────────────────────┼─────────────────────┤
19+
UArrayStack Top+ 0s 3ms 367356ns+ 0s 16ms 241029ns
20+
├──────────────────┼────────────────────┼─────────────────────┤
21+
BArrayStack Top+ 0s 3ms 168186ns+ 0s 14ms 461727ns
22+
├──────────────────┼────────────────────┼─────────────────────┤
23+
LinkedStack Pop+ 0s 5ms 66436ns+ 0s 28ms 798899ns
24+
├──────────────────┼────────────────────┼─────────────────────┤
25+
UArrayStack Pop+ 0s 3ms 528070ns+ 0s 3ms 528070ns
26+
├──────────────────┼────────────────────┼─────────────────────┤
27+
BArrayStack Pop+ 0s 2ms 697348ns+ 0s 2ms 697348ns
28+
└──────────────────┴────────────────────┴─────────────────────┘
29+
```
30+
31+
## Queues
32+
33+
```csharp
34+
┌────────────────────────┬─────────────────────┬───────────────────────┐
35+
Queue Operation100,000 items1,000,000 items
36+
├────────────────────────┼─────────────────────┼───────────────────────┤
37+
LinkedQueue Enqueue+ 0s 30ms 912807ns+ 0s 152ms 813615ns
38+
├────────────────────────┼─────────────────────┼───────────────────────┤
39+
UArrayQueue Enqueue+ 0s 5ms 971997ns+ 0s 44ms 899352ns
40+
├────────────────────────┼─────────────────────┼───────────────────────┤
41+
BFltArrayQueue Enqueue+ 0s 3ms 824733ns+ 0s 18ms 102334ns
42+
├────────────────────────┼─────────────────────┼───────────────────────┤
43+
BFixArrayQueue Enqueue+ 0s 8ms 141539ns+ 0s 17ms 4255ns
44+
├────────────────────────┼─────────────────────┼───────────────────────┤
45+
LinkedQueue Peek+ 0s 2ms 939700ns+ 0s 14ms 605871ns
46+
├────────────────────────┼─────────────────────┼───────────────────────┤
47+
UArrayQueue Peek+ 0s 2ms 551683ns+ 0s 17ms 84358ns
48+
├────────────────────────┼─────────────────────┼───────────────────────┤
49+
BFltArrayQueue Peek+ 0s 2ms 924676ns+ 0s 18ms 769628ns
50+
├────────────────────────┼─────────────────────┼───────────────────────┤
51+
BFixArrayQueue Peek+ 0s 2ms 275064ns+ 0s 19ms 66396ns
52+
├────────────────────────┼─────────────────────┼───────────────────────┤
53+
LinkedQueue Dequeue+ 0s 4ms 498343ns+ 0s 17ms 900240ns
54+
├────────────────────────┼─────────────────────┼───────────────────────┤
55+
UArrayQueue Dequeue+ 1s 772ms 610030ns+ 167s 551ms 767324ns
56+
├────────────────────────┼─────────────────────┼───────────────────────┤
57+
BFltArrayQueue Dequeue+ 0s 3ms 678644ns+ 0s 19ms 273733ns
58+
├────────────────────────┼─────────────────────┼───────────────────────┤
59+
BFixArrayQueue Dequeue+ 7s 16ms 659904ns+ 782s 431ms 330080ns
60+
└────────────────────────┴─────────────────────┴───────────────────────┘
61+
```

benchmark/queues.js

Lines changed: 108 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,112 @@
11
let { queues } = require('./../index');
22
let ptime = require('quick-ptime');
3+
const Table = require('cli-table');
4+
var ProgressBar = require('progress');
35

6+
let bar;
47

5-
// setup stacks
6-
let queue = new queues.Queue();
7-
let arrayQueue = new queues.ArrayQueue();
8-
9-
// enqueue 100,000 items into the queue
10-
ptime.setTime('queue100000');
11-
for(let i = 0; i < 100000; i++) {
12-
queue.enqueue('value');
13-
}
14-
console.log("Enqueue 100,000 Queue timing:", ptime.elapsedTime('queue100000').formatted);
15-
16-
ptime.setTime('arrayqueue100000');
17-
for(let i = 0; i < 100000; i++) {
18-
arrayQueue.enqueue('value');
19-
}
20-
console.log("Enqueue 100,000 Array Queue timing:", ptime.elapsedTime('arrayqueue100000').formatted);
21-
22-
// dequeue 100,000 items into the queue
23-
ptime.setTime('dqueue100000');
24-
for(let i = 0; i < 100000; i++) {
25-
queue.dequeue();
26-
}
27-
console.log("Dequeue 100,000 Queue timing:", ptime.elapsedTime('dqueue100000').formatted);
28-
29-
ptime.setTime('darrayqueue100000');
30-
for(let i = 0; i < 100000; i++) {
31-
arrayQueue.dequeue();
32-
}
33-
console.log("Dequeue 100,000 Array Queue timing:", ptime.elapsedTime('darrayqueue100000').formatted);
8+
const testStandard = async (name, adt, count) => {
9+
const iADT = new adt(count);
10+
bar.tick({
11+
token1: `${name} adt setup`,
12+
});
13+
results = [];
14+
results.push(
15+
(await ptime.runFunctionRounds(`${name} enqueue ${count}`, iADT.enqueue.bind(iADT), [1], count, true)).formatted
16+
);
17+
bar.tick({
18+
token1: `${name} enqueue ${count}`,
19+
});
20+
results.push(
21+
(await ptime.runFunctionRounds(`${name} peek ${count}`, iADT.peek.bind(iADT), [1], count, true)).formatted
22+
);
23+
bar.tick({
24+
token1: `${name} peek ${count}`,
25+
});
26+
results.push(
27+
(await ptime.runFunctionRounds(`${name} dequeue ${count}`, iADT.dequeue.bind(iADT), [1], count, true)).formatted
28+
);
29+
bar.tick({
30+
token1: `${name} dequeue ${count}`,
31+
});
32+
33+
return results;
34+
};
35+
36+
const run = async () => {
37+
bar = new ProgressBar(':bar Last Completed :token1 :percent :elapseds total, completes in :etas', { total: 34 });
38+
bar.tick({
39+
token1: 'progress bar',
40+
});
41+
42+
let results = {};
43+
44+
results['LinkedQueue Enqueue'] = [];
45+
results['UArrayQueue Enqueue'] = [];
46+
results['BFltArrayQueue Enqueue'] = [];
47+
results['BFixArrayQueue Enqueue'] = [];
48+
49+
results['LinkedQueue Peek'] = [];
50+
results['UArrayQueue Peek'] = [];
51+
results['BFltArrayQueue Peek'] = [];
52+
results['BFixArrayQueue Peek'] = [];
53+
54+
results['LinkedQueue Dequeue'] = [];
55+
results['UArrayQueue Dequeue'] = [];
56+
results['BFltArrayQueue Dequeue'] = [];
57+
results['BFixArrayQueue Dequeue'] = [];
58+
59+
bar.tick({
60+
token1: 'result sets setup',
61+
});
62+
63+
const lQueue100000 = await testStandard('LinkedQueue', queues.LinkedQueue, 100000);
64+
const lQueue1000000 = await testStandard('LinkedQueue', queues.LinkedQueue, 1000000);
65+
// const lQueue10000000 = await testStandard('LinkedQueue', queues.LinkedQueue, 10000000);
66+
results['LinkedQueue Enqueue'].push(lQueue100000[0], lQueue1000000[0]);
67+
results['LinkedQueue Peek'].push(lQueue100000[1], lQueue1000000[1]);
68+
results['LinkedQueue Dequeue'].push(lQueue100000[2], lQueue1000000[2]);
69+
70+
const bfltQueue100000 = await testStandard('BFltArrayQueue', queues.BFltArrayQueue, 100000);
71+
const bfltQueue1000000 = await testStandard('BFltArrayQueue', queues.BFltArrayQueue, 1000000);
72+
// const bfltQueue10000000 = await testStandard('BFltArrayQueue', queues.BFltArrayQueue, 10000000);
73+
results['BFltArrayQueue Enqueue'].push(bfltQueue100000[0], bfltQueue1000000[0]);
74+
results['BFltArrayQueue Peek'].push(bfltQueue100000[1], bfltQueue1000000[1]);
75+
results['BFltArrayQueue Dequeue'].push(bfltQueue100000[2], bfltQueue1000000[2]);
76+
77+
const uQueue100000 = await testStandard('UArrayQueue', queues.UArrayQueue, 100000);
78+
const uQueue1000000 = await testStandard('UArrayQueue', queues.UArrayQueue, 1000000);
79+
// const uQueue10000000 = await testStandard('UArrayQueue', queues.UArrayQueue, 10000000);
80+
results['UArrayQueue Enqueue'].push(uQueue100000[0], uQueue1000000[0]);
81+
results['UArrayQueue Peek'].push(uQueue100000[1], uQueue1000000[1]);
82+
results['UArrayQueue Dequeue'].push(uQueue100000[2], uQueue1000000[2]);
83+
84+
const bfixQueue100000 = await testStandard('BFixArrayQueue', queues.BFixArrayQueue, 100000);
85+
const bfixQueue1000000 = await testStandard('BFixArrayQueue', queues.BFixArrayQueue, 1000000);
86+
// const bfixQueue10000000 = await testStandard('BFixArrayQueue', queues.BFixArrayQueue, 10000000);
87+
results['BFixArrayQueue Enqueue'].push(bfixQueue100000[0], bfixQueue1000000[0]);
88+
results['BFixArrayQueue Peek'].push(bfixQueue100000[1], bfixQueue1000000[1]);
89+
results['BFixArrayQueue Dequeue'].push(bfixQueue100000[2], bfixQueue1000000[2]);
90+
91+
let items = [];
92+
93+
let keys = Object.keys(results);
94+
for (let i = 0; i < keys.length; i++) {
95+
let item = {};
96+
item[keys[i]] = results[keys[i]];
97+
items.push(item);
98+
}
99+
100+
return items;
101+
};
102+
103+
run().then(value => {
104+
const table = new Table({
105+
head: ['Queue Operation', '100,000 items', '1,000,000 items'],
106+
});
107+
108+
table.push(...value);
109+
110+
console.log('\n');
111+
console.log(table.toString());
112+
});

0 commit comments

Comments
 (0)