-
-
Notifications
You must be signed in to change notification settings - Fork 53
/
memory-monitor.js
84 lines (65 loc) · 2.17 KB
/
memory-monitor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
'use strict';
const RE2 = require('../../re2');
const N = 5_000_000;
console.log('Never-ending loop: exit with Ctrl+C.');
const aCharCode = 'a'.charCodeAt(0);
const randomAlpha = () => String.fromCharCode(aCharCode + Math.floor(Math.random() * 26));
const humanizeNumber = n => {
const negative = n < 0;
if (negative) n = -n;
const s = n.toFixed();
let group1 = s.length % 3;
if (!group1) group1 = 3;
let result = s.substring(0, group1);
for (let i = group1; i < s.length; i += 3) {
result += ',' + s.substring(i, i + 3);
}
return (negative ? '-' : '') + result;
};
const CSI = '\x1B[';
const cursorUp = (n = 1) => CSI + (n > 1 ? n.toFixed() : '') + 'A';
const sgr = (cmd = '') => CSI + (Array.isArray(cmd) ? cmd.join(';') : cmd) + 'm';
const RESET = sgr();
const NOTE = sgr(91);
let first = true;
const maxMemory = {heapTotal: 0, heapUsed: 0, external: 0, arrayBuffers: 0, rss: 0},
labels = {
heapTotal: 'heap total',
heapUsed: 'heap used',
external: 'external',
arrayBuffers: 'array buffers',
rss: 'resident set size'
},
maxLabelSize = Math.max(...Array.from(Object.values(labels)).map(label => label.length));
const report = () => {
const memoryUsage = process.memoryUsage(),
previousMax = {...maxMemory};
console.log((first ? '' : '\r' + cursorUp(6)) +
''.padStart(maxLabelSize + 1), 'Current'.padStart(15), 'Max'.padStart(15));
for (const name in maxMemory) {
const prefix = previousMax[name] && previousMax[name] < memoryUsage[name] ? NOTE : RESET;
console.log(
(labels[name] + ':').padStart(maxLabelSize + 1),
prefix + humanizeNumber(memoryUsage[name]).padStart(15) + RESET,
humanizeNumber(maxMemory[name]).padStart(15)
);
}
for (const [name, value] of Object.entries(maxMemory)) {
maxMemory[name] = Math.max(value, memoryUsage[name]);
}
first = false;
}
for (;;) {
const re2 = new RE2(randomAlpha(), 'g');
let s = '';
for (let i = 0; i < N; ++i) s += randomAlpha();
let n = 0;
for (const _ of s.matchAll(re2)) ++n;
re2.lastIndex = 0;
const r = s.replace(re2, '');
if (r.length + n != s.length) {
console.log('ERROR!', 's:', s.length, 'r:', r.length, 'n:', n, 're2:', re2.toString());
break;
}
report();
}