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