Skip to content

Commit 7359956

Browse files
committed
lots of things added for queues and benchmark changes
1 parent 034b5b5 commit 7359956

File tree

6 files changed

+149
-78
lines changed

6 files changed

+149
-78
lines changed

.vscode/settings.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
"prettier.printWidth": 120,
33
"prettier.singleQuote": true,
44
"prettier.trailingComma": "es5",
5-
"editor.formatOnSave": true,
6-
"editor.formatOnPaste": true
5+
"editor.formatOnSave": true
76
}

benchmark/README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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 items10,000,000 items1 item AVG
10+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
11+
LinkedStack Push+ 0s 72ms 604378ns+ 0s 490ms 392994ns+ 0s 679ms 443796ns+ 0s 0ms 380ns
12+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
13+
UArrayStack Push+ 0s 4ms 152081ns+ 0s 35ms 273276ns+ 0s 366ms 739960ns+ 0s 0ms 412ns
14+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
15+
BArrayStack Push+ 0s 3ms 151240ns+ 0s 14ms 50745ns+ 0s 121ms 911861ns+ 0s 0ms 414ns
16+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
17+
LinkedStack Top+ 0s 2ms 692099ns+ 0s 17ms 247035ns+ 0s 140ms 399996ns+ 0s 0ms 399ns
18+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
19+
UArrayStack Top+ 0s 2ms 480592ns+ 0s 15ms 283810ns+ 0s 132ms 680935ns+ 0s 0ms 403ns
20+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
21+
BArrayStack Top+ 0s 2ms 994832ns+ 0s 16ms 72632ns+ 0s 131ms 158011ns+ 0s 0ms 400ns
22+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
23+
LinkedStack Pop+ 0s 3ms 780284ns+ 0s 18ms 598744ns+ 0s 168ms 865081ns+ 0s 0ms 421ns
24+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
25+
UArrayStack Pop+ 0s 3ms 538130ns+ 0s 17ms 898436ns+ 0s 143ms 24024ns+ 0s 0ms 410ns
26+
├──────────────────┼────────────────────┼─────────────────────┼─────────────────────┼────────────────┤
27+
BArrayStack Pop+ 0s 3ms 1401ns+ 0s 16ms 620513ns+ 0s 148ms 407324ns+ 0s 0ms 398ns
28+
└──────────────────┴────────────────────┴─────────────────────┴─────────────────────┴────────────────┘
29+
```
30+
31+
## Queues
32+
33+
10,000,000 and 1 Average were omitted due to the time it takes to run those tests on the inefficient queue system (one most taught by js professionals sadly) (I let it run for 2 hours on 10,000,000 dequeues and it never completed...);
34+
35+
```csharp
36+
37+
```

benchmark/queues.js

Lines changed: 91 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -5,82 +5,108 @@ var ProgressBar = require('progress');
55

66
let bar;
77

8-
const standard = async (name, func, value) => {
9-
// console.log("Running...", name);
10-
const result = [
11-
(await ptime.runFunctionRounds(`${name} 100000`, func, [value], 100000, true)).formatted,
12-
(await ptime.runFunctionRounds(`${name} 1000000`, func, [value], 1000000, true)).formatted,
13-
(await ptime.runFunctionRounds(`${name} 10000000`, func, [value], 10000000, true)).formatted,
14-
(await ptime.runFunctionAverage(`${name} 1`, func, [value], 1000000, true)).formatted,
15-
];
16-
17-
let str = {};
18-
str[name] = result;
19-
bar.tick();
20-
return str;
21-
};
22-
23-
const run = async () => {
24-
let results = [];
25-
let linkedStack = new stacks.LinkedStack();
26-
let uArrayStack = new stacks.UArrayStack();
27-
let bArrayStack = new stacks.BArrayStack(12100000);
28-
bar = new ProgressBar(':bar :percent :elapseds total, completes in :etas', { total: 10 });
29-
bar.tick();
8+
const testStandard = async (name, adt, count) => {
9+
const iADT = new adt(count);
10+
bar.tick({
11+
token1: `${name} adt setup`,
12+
});
13+
results = [];
3014
results.push(
31-
await standard('LinkedStack Push', linkedStack.push.bind(linkedStack), 1),
32-
await standard('UArrayStack Push', uArrayStack.push.bind(uArrayStack), 1),
33-
await standard('BArrayStack Push', bArrayStack.push.bind(bArrayStack), 1),
34-
await standard('LinkedStack Top', linkedStack.top.bind(linkedStack), 1),
35-
await standard('UArrayStack Top', uArrayStack.top.bind(uArrayStack), 1),
36-
await standard('BArrayStack Top', bArrayStack.top.bind(bArrayStack), 1),
37-
await standard('LinkedStack Pop', linkedStack.pop.bind(linkedStack), 1),
38-
await standard('UArrayStack Pop', uArrayStack.pop.bind(uArrayStack), 1),
39-
await standard('BArrayStack Pop', bArrayStack.pop.bind(bArrayStack), 1)
15+
(await ptime.runFunctionRounds(`${name} enqueue ${count}`, iADT.enqueue.bind(iADT), [1], count, true)).formatted
4016
);
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+
});
4132

4233
return results;
4334
};
4435

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+
45103
run().then(value => {
46104
const table = new Table({
47-
head: ['Stack Operation', '100,000 items', '1,000,000 items', '10,000,000 items', '1 item AVG'],
105+
head: ['Queue Operation', '100,000 items', '1,000,000 items'],
48106
});
49107

50108
table.push(...value);
51109

110+
console.log('\n');
52111
console.log(table.toString());
53112
});
54-
55-
// let { queues } = require('./../index');
56-
// let ptime = require('quick-ptime');
57-
58-
// // setup stacks
59-
// let queue = new queues.Queue();
60-
// let arrayQueue = new queues.ArrayQueue();
61-
62-
// // enqueue 100,000 items into the queue
63-
// ptime.setTime('queue100000');
64-
// for (let i = 0; i < 100000; i++) {
65-
// queue.enqueue('value');
66-
// }
67-
// console.log('Enqueue 100,000 Queue timing:', ptime.elapsedTime('queue100000').formatted);
68-
69-
// ptime.setTime('arrayqueue100000');
70-
// for (let i = 0; i < 100000; i++) {
71-
// arrayQueue.enqueue('value');
72-
// }
73-
// console.log('Enqueue 100,000 Array Queue timing:', ptime.elapsedTime('arrayqueue100000').formatted);
74-
75-
// // dequeue 100,000 items into the queue
76-
// ptime.setTime('dqueue100000');
77-
// for (let i = 0; i < 100000; i++) {
78-
// queue.dequeue();
79-
// }
80-
// console.log('Dequeue 100,000 Queue timing:', ptime.elapsedTime('dqueue100000').formatted);
81-
82-
// ptime.setTime('darrayqueue100000');
83-
// for (let i = 0; i < 100000; i++) {
84-
// arrayQueue.dequeue();
85-
// }
86-
// console.log('Dequeue 100,000 Array Queue timing:', ptime.elapsedTime('darrayqueue100000').formatted);

benchmark/stacks.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ const standard = async (name, func, value) => {
2121
};
2222

2323
const run = async () => {
24+
bar = new ProgressBar(':bar :percent :elapseds total, completes in :etas', { total: 11 });
2425
let results = [];
2526
let linkedStack = new stacks.LinkedStack();
2627
let uArrayStack = new stacks.UArrayStack();
28+
bar.tick();
2729
let bArrayStack = new stacks.BArrayStack(12100000);
28-
bar = new ProgressBar(':bar :percent :elapseds total, completes in :etas', { total: 10 });
30+
2931
bar.tick();
3032
results.push(
3133
await standard('LinkedStack Push', linkedStack.push.bind(linkedStack), 1),
@@ -49,5 +51,6 @@ run().then(value => {
4951

5052
table.push(...value);
5153

54+
console.log('\n');
5255
console.log(table.toString());
5356
});

lib/queues.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ class UArrayQueue {
6161

6262
enqueue(data) {
6363
this.length++;
64-
return this.queue.unshift(data);
64+
return this.queue.push(data);
6565
}
6666

6767
dequeue() {
6868
this.length--;
69-
return this.queue.pop();
69+
return this.queue.shift();
7070
}
7171

7272
peek() {

readme.md

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,23 @@ So I am starting fresh and am going to work to tackle different types of data st
1414
1515
I want to walk the walk before I talk the talk. Using this repository.
1616

17+
## Benchmarks
18+
19+
If you would like to see some benchmarks on these data structures then [click here...](/benchmark/README.md);
20+
1721
## Theories & Structures
1822

1923
As theories and structures are built, I'll list them under this heading.
2024

21-
> You won't see a todo list or a target list this time around. I'll take suggestions as issues on the repository, but I'm going to focus on building commong structures and items one at a time. One thing I have learned as a developer is never get ahead of yourself, you can get paralyzed with planning and expectations.
25+
> You won't see a todo list or a target list this time around. I'll take suggestions as issues on the repository, but I'm going to focus on building common structures and items one at a time. One thing I have learned as a developer is never get ahead of yourself, you can get paralyzed with planning and expectations.
2226
23-
- `LinkedStack`: based on a linked list (slow)
27+
- `LinkedStack`: based on a linked list (slower)
2428
- `UArrayStack`: based on JS unbounded array (fast)
2529
- `BArrayStack`: based on JS bounded array (fastest)
26-
- `Queue`: based on a linked list (fast)
27-
- `ArrayQueue`: based on JS array (slow)
30+
- `LinkedQueue`: based on a linked list (fast)
31+
- `UArrayQueue`: based on JS array unbound (very slow) **Sadly this is the one most professionals teach and it is so wrong**
32+
- `BFixArrayQueue`: based on JS array bounded but with fixed front at 0 index (slowest) **only shown for educational purposes**
33+
- `BFltArrayQueue`: based on JS array bounded but with floating front index (fastest)
2834

2935
## Use in your projects
3036

@@ -41,8 +47,8 @@ yarn add data-theory
4147
```javascript
4248
const { queues } = require('data-theory');
4349

44-
let queue = new queues.Queue();
50+
let queue = new queues.LinkedQueue();
4551

46-
queue.enqueue('item'); // 1
47-
queue.dequeue(); // 'item'
48-
```
52+
queue.enqueue('item');
53+
queue.dequeue();
54+
```

0 commit comments

Comments
 (0)