• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import { readFile } from 'node:fs/promises';
2import format from 'human-format';
3import memwatch from '@airbnb/node-memwatch';
4import { SAXParser } from '../../packages/parse5-sax-parser/dist/index.js';
5import { finished } from 'parse5-test-utils/dist/common.js';
6
7const heapDiffMeasurement = new memwatch.HeapDiff();
8
9let maxMemUsage = 0;
10
11memwatch.on('stats', (stats) => {
12    maxMemUsage = Math.max(maxMemUsage, stats.used_heap_size);
13});
14
15const statsPromise = new Promise((resolve) => memwatch.once('stats', resolve));
16
17const startDate = new Date();
18
19const parsedDataSize = await parse();
20const endDate = new Date();
21const heapDiff = heapDiffMeasurement.end();
22
23// NOTE: we need at least one `stats` result to get maxMemUsage
24await statsPromise;
25
26async function parse() {
27    const data = await readFile(new URL('../../test/data/huge-page/huge-page.html', import.meta.url), 'utf8');
28    let parsedDataSize = 0;
29    const stream = new SAXParser();
30
31    for (let i = 0; i < 200; i++) {
32        parsedDataSize += data.length;
33        stream.write(data);
34    }
35
36    stream.end();
37
38    await finished(stream);
39
40    return parsedDataSize;
41}
42
43console.log('Input data size:', format(parsedDataSize, { unit: 'B' }));
44
45const scale = new format.Scale({
46    seconds: 1,
47    minutes: 60,
48    hours: 3600,
49});
50
51console.log('Duration:', format((endDate - startDate) / 1000, { scale }));
52console.log('Memory before:', heapDiff.before.size);
53console.log('Memory after:', heapDiff.after.size);
54console.log('Memory max:', format(maxMemUsage, { unit: 'B' }));
55