1'use strict'; 2 3const fs = require('fs'); 4const format = require('human-format'); 5const promisifyEvent = require('promisify-event'); 6const memwatch = require('node-memwatch'); 7const SAXParser = require('../../packages/parse5-sax-parser/lib'); 8 9main(); 10 11async function main() { 12 let parsedDataSize = 0; 13 let maxMemUsage = 0; 14 let startDate = null; 15 let endDate = null; 16 const heapDiffMeasurement = new memwatch.HeapDiff(); 17 let heapDiff = null; 18 19 memwatch.on('stats', stats => { 20 maxMemUsage = Math.max(maxMemUsage, stats['current_base']); 21 }); 22 23 startDate = new Date(); 24 25 const parserPromise = parse().then(dataSize => { 26 parsedDataSize = dataSize; 27 endDate = new Date(); 28 heapDiff = heapDiffMeasurement.end(); 29 }); 30 31 await Promise.all([ 32 parserPromise, 33 promisifyEvent(memwatch, 'stats') // NOTE: we need at least one `stats` result 34 ]); 35 36 printResults(parsedDataSize, startDate, endDate, heapDiff, maxMemUsage); 37} 38 39async function parse() { 40 const data = fs.readFileSync('../test/data/huge-page/huge-page.html', 'utf8'); 41 let parsedDataSize = 0; 42 const stream = new SAXParser(); 43 44 for (let i = 0; i < 200; i++) { 45 parsedDataSize += data.length; 46 stream.write(data); 47 } 48 49 stream.end(); 50 51 await promisifyEvent(stream, 'finish'); 52 53 return parsedDataSize; 54} 55 56function getDuration(startDate, endDate) { 57 const scale = new format.Scale({ 58 seconds: 1, 59 minutes: 60, 60 hours: 3600 61 }); 62 63 return format((endDate - startDate) / 1000, { scale: scale }); 64} 65 66function printResults(parsedDataSize, startDate, endDate, heapDiff, maxMemUsage) { 67 console.log('Input data size:', format(parsedDataSize, { unit: 'B' })); 68 console.log('Duration: ', getDuration(startDate, endDate)); 69 console.log('Memory before: ', heapDiff.before.size); 70 console.log('Memory after: ', heapDiff.after.size); 71 console.log('Memory max: ', format(maxMemUsage, { unit: 'B' })); 72} 73