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