193fb6ee3Sopenharmony_ciimport { readFile } from 'node:fs/promises'; 293fb6ee3Sopenharmony_ciimport format from 'human-format'; 393fb6ee3Sopenharmony_ciimport memwatch from '@airbnb/node-memwatch'; 493fb6ee3Sopenharmony_ciimport { SAXParser } from '../../packages/parse5-sax-parser/dist/index.js'; 593fb6ee3Sopenharmony_ciimport { finished } from 'parse5-test-utils/dist/common.js'; 693fb6ee3Sopenharmony_ci 793fb6ee3Sopenharmony_ciconst heapDiffMeasurement = new memwatch.HeapDiff(); 893fb6ee3Sopenharmony_ci 993fb6ee3Sopenharmony_cilet maxMemUsage = 0; 1093fb6ee3Sopenharmony_ci 1193fb6ee3Sopenharmony_cimemwatch.on('stats', (stats) => { 1293fb6ee3Sopenharmony_ci maxMemUsage = Math.max(maxMemUsage, stats.used_heap_size); 1393fb6ee3Sopenharmony_ci}); 1493fb6ee3Sopenharmony_ci 1593fb6ee3Sopenharmony_ciconst statsPromise = new Promise((resolve) => memwatch.once('stats', resolve)); 1693fb6ee3Sopenharmony_ci 1793fb6ee3Sopenharmony_ciconst startDate = new Date(); 1893fb6ee3Sopenharmony_ci 1993fb6ee3Sopenharmony_ciconst parsedDataSize = await parse(); 2093fb6ee3Sopenharmony_ciconst endDate = new Date(); 2193fb6ee3Sopenharmony_ciconst heapDiff = heapDiffMeasurement.end(); 2293fb6ee3Sopenharmony_ci 2393fb6ee3Sopenharmony_ci// NOTE: we need at least one `stats` result to get maxMemUsage 2493fb6ee3Sopenharmony_ciawait statsPromise; 2593fb6ee3Sopenharmony_ci 2693fb6ee3Sopenharmony_ciasync function parse() { 2793fb6ee3Sopenharmony_ci const data = await readFile(new URL('../../test/data/huge-page/huge-page.html', import.meta.url), 'utf8'); 2893fb6ee3Sopenharmony_ci let parsedDataSize = 0; 2993fb6ee3Sopenharmony_ci const stream = new SAXParser(); 3093fb6ee3Sopenharmony_ci 3193fb6ee3Sopenharmony_ci for (let i = 0; i < 200; i++) { 3293fb6ee3Sopenharmony_ci parsedDataSize += data.length; 3393fb6ee3Sopenharmony_ci stream.write(data); 3493fb6ee3Sopenharmony_ci } 3593fb6ee3Sopenharmony_ci 3693fb6ee3Sopenharmony_ci stream.end(); 3793fb6ee3Sopenharmony_ci 3893fb6ee3Sopenharmony_ci await finished(stream); 3993fb6ee3Sopenharmony_ci 4093fb6ee3Sopenharmony_ci return parsedDataSize; 4193fb6ee3Sopenharmony_ci} 4293fb6ee3Sopenharmony_ci 4393fb6ee3Sopenharmony_ciconsole.log('Input data size:', format(parsedDataSize, { unit: 'B' })); 4493fb6ee3Sopenharmony_ci 4593fb6ee3Sopenharmony_ciconst scale = new format.Scale({ 4693fb6ee3Sopenharmony_ci seconds: 1, 4793fb6ee3Sopenharmony_ci minutes: 60, 4893fb6ee3Sopenharmony_ci hours: 3600, 4993fb6ee3Sopenharmony_ci}); 5093fb6ee3Sopenharmony_ci 5193fb6ee3Sopenharmony_ciconsole.log('Duration:', format((endDate - startDate) / 1000, { scale })); 5293fb6ee3Sopenharmony_ciconsole.log('Memory before:', heapDiff.before.size); 5393fb6ee3Sopenharmony_ciconsole.log('Memory after:', heapDiff.after.size); 5493fb6ee3Sopenharmony_ciconsole.log('Memory max:', format(maxMemUsage, { unit: 'B' })); 55