Skip to content

Commit 9623297

Browse files
committed
Separate process per test
1 parent c05348b commit 9623297

File tree

5 files changed

+93
-60
lines changed

5 files changed

+93
-60
lines changed

Performance/run.js

+24-45
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,34 @@
11
'use strict';
22

3+
const { execSync } = require('node:child_process');
34
const { performance } = require('node:perf_hooks');
45

5-
const OPS = 100_000;
6-
7-
const options = { nodeSize: 2048, poolSize: 2 };
8-
9-
const implementations = {
10-
queue: require('../JavaScript/1-queue.js'),
11-
naïve: require('../JavaScript/2-naïve.js'),
12-
fixed: require('../JavaScript/3-fixed.js'),
13-
unrolled: require('../JavaScript/4-unrolled.js'),
14-
spare: require('../JavaScript/5-spare.js'),
15-
pool: require('../JavaScript/6-pool.js'),
16-
circular: require('../JavaScript/8-circular.js'),
17-
nodiv: require('../JavaScript/9-no-div.js'),
18-
};
19-
20-
const test = (queue) => {
21-
const startMem = process.memoryUsage().heapUsed;
22-
const t0 = performance.now();
23-
24-
let preventOpt = 0;
25-
for (let i = 0; i < OPS; i++) {
26-
queue.enqueue({ id: i });
27-
}
28-
for (let i = 0; i < OPS; i++) {
29-
const { id } = queue.dequeue();
30-
preventOpt += id;
31-
}
32-
33-
const t1 = performance.now();
34-
if (preventOpt === 0) console.log('Never print');
35-
const endMem = process.memoryUsage().heapUsed;
36-
37-
return {
38-
cpu: (t1 - t0).toFixed(2),
39-
memory: ((endMem - startMem) / 1024).toFixed(2),
40-
};
41-
};
6+
const implementations = [
7+
//['1-queue.js', 2048, 1],
8+
['2-naïve.js', 2048, 1],
9+
['3-fixed.js', 2048, 1],
10+
['4-unrolled.js', 2048, 1],
11+
['5-spare.js', 2048, 1],
12+
['6-pool.js', 1024, 2],
13+
//['7-current.js', 1024, 2],
14+
['8-circular.js', 2048, 1],
15+
['9-nodiv.js', 2048, 1],
16+
];
17+
18+
const rounds = 100;
19+
const ops = 500_000;
4220

4321
const main = () => {
44-
const results = {};
45-
const entries = Object.entries(implementations);
46-
for (const { 0: name, 1: Queue } of entries) {
47-
global.gc();
48-
const queue = new Queue(options);
49-
const result = test(queue);
50-
results[name] = result;
22+
const results = [];
23+
for (const [file, nodeSize, poolSize] of implementations) {
24+
const options = `${file} ${rounds} ${ops} ${nodeSize} ${poolSize}`;
25+
console.log(`Test: ${options}`);
26+
const cmd = `node --expose-gc Performance/test.js ${options}`;
27+
const out = execSync(cmd, { encoding: 'utf8' });
28+
results.push(out.replaceAll('\n', ','));
5129
}
52-
console.table(results);
30+
const data = results.join('').slice(0, -1);
31+
console.table(JSON.parse(`[${data}]`));
5332
};
5433

5534
main();

Performance/run.sh

-1
This file was deleted.

Performance/test.js

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
'use strict';
2+
3+
const path = require('node:path');
4+
const process = require('node:process');
5+
const { performance } = require('node:perf_hooks');
6+
7+
const WARM_UP = 3;
8+
9+
const test = (queue, ops) => {
10+
global.gc();
11+
const startMem = process.memoryUsage().heapUsed;
12+
const t0 = performance.now();
13+
14+
let preventOpt = 0;
15+
for (let i = 0; i < ops; i++) {
16+
queue.enqueue({ id: i });
17+
}
18+
for (let i = 0; i < ops; i++) {
19+
const { id } = queue.dequeue();
20+
preventOpt += id;
21+
}
22+
23+
const t1 = performance.now();
24+
if (preventOpt === 0) console.log('Never print');
25+
const endMem = process.memoryUsage().heapUsed;
26+
27+
return { cpu: t1 - t0, ram: (endMem - startMem) / 1024 };
28+
};
29+
30+
const main = (file, rounds, ops, options) => {
31+
const name = path.basename(file, '.js').split('-').at(-1);
32+
const Queue = require(`../JavaScript/${file}`);
33+
const queue = new Queue(options);
34+
const results = { cpu: 0, ram: 0 };
35+
const count = rounds + WARM_UP;
36+
for (let i = 0; i < count; i++) {
37+
const { cpu, ram } = test(queue, ops);
38+
if (i > WARM_UP) {
39+
results.cpu += cpu;
40+
results.ram += ram;
41+
}
42+
}
43+
results.cpu = (results.cpu / rounds).toFixed(2);
44+
results.ram = (results.ram / rounds).toFixed(2);
45+
console.log(JSON.stringify({ name, ...results }));
46+
};
47+
48+
const file = process.argv.at(2);
49+
const rounds = parseInt(process.argv.at(3));
50+
const ops = parseInt(process.argv.at(4));
51+
const nodeSize = parseInt(process.argv.at(5));
52+
const poolSize = parseInt(process.argv.at(6));
53+
const options = { nodeSize, poolSize };
54+
55+
main(file, rounds, ops, options);

README.md

+13-14
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,20 @@
2323

2424
## Performance tests
2525

26-
> Node: UNDER CONSTRUCTION
26+
> UNDER CONSTRUCTION
2727
28-
Run: `Performance/run.sh`
28+
Run: `npm run perf`
2929

3030
```
31-
┌──────────┬──────────┬───────────┐
32-
│ (index) │ cpu │ memory │
33-
├──────────┼──────────┼───────────┤
34-
│ queue │ '576.54' │ '5524.62' │
35-
│ naïve │ '12.06' │ '7620.13' │
36-
│ fixed │ '6.32' │ '6045.08' │
37-
│ unrolled │ '6.46' │ '6045.98' │
38-
│ spare │ '6.72' │ '5896.03' │
39-
│ pool │ '6.51' │ '6029.93' │
40-
│ circular │ '5.67' │ '5510.35' │
41-
│ nodiv │ '4.45' │ '4093.59' │
42-
└──────────┴──────────┴───────────┘
31+
┌─────────┬────────────┬─────────┬────────────┐
32+
│ (index) │ name │ cpu │ ram │
33+
├─────────┼────────────┼─────────┼────────────┤
34+
│ 0 │ 'naïve' │ '43.03' │ '34928.97' │
35+
│ 1 │ 'fixed' │ '4.56' │ '19652.08' │
36+
│ 2 │ 'unrolled' │ '4.52' │ '19470.65' │
37+
│ 3 │ 'spare' │ '4.46' │ '19471.69' │
38+
│ 4 │ 'pool' │ '5.14' │ '19507.93' │
39+
│ 5 │ 'circular' │ '5.59' │ '19601.37' │
40+
│ 6 │ 'nodiv' │ '5.11' │ '19627.76' │
41+
└─────────┴────────────┴─────────┴────────────┘
4342
```

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"name": "patterns",
33
"version": "1.0.0",
44
"scripts": {
5+
"perf": "node Performance/run.js",
56
"lint": "eslint . && prettier -c \"**/*.js\"",
67
"fix": "eslint . --fix && prettier --write \"**/*.js\"",
78
"build": "tsc; prettier --write \"**/*.js\""

0 commit comments

Comments
 (0)