diff --git a/README.OpenSource b/README.OpenSource index dd3ed57bebfe132c692c6fc9c0c2419153737638..2852d965038ff935767d67ddec06ac4538875ea5 100644 --- a/README.OpenSource +++ b/README.OpenSource @@ -3,7 +3,7 @@ "Name": "parse5", "License": "MIT", "License File": "NOTICE", - "Version Number": " 6.0.1", + "Version Number": "7.0.0", "Owner": "sunbingxin@huawei.com", "Upstream URL": "https://github.com/inikulin/parse5.git", "Description": "HTML parser and serializer." diff --git a/bench/.eslintrc.js b/bench/.eslintrc.js deleted file mode 100644 index 401a667b5f7c560961dbdd5af01e65c9c300057c..0000000000000000000000000000000000000000 --- a/bench/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - extends: ['../.eslintrc.js'], - rules: { - 'no-console': 'off' - }, - parserOptions: { - ecmaVersion: 8 - } -}; diff --git a/bench/.eslintrc.json b/bench/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..1cb404c3c102ba186ee167c09c3d124a98054877 --- /dev/null +++ b/bench/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "extends": ["../.eslintrc.json"], + "rules": { + "no-console": "off" + } +} diff --git a/bench/memory/named-entity-data.js b/bench/memory/named-entity-data.js deleted file mode 100644 index bca60f005a04f5589fd9c9d6c7b676be9af99bb9..0000000000000000000000000000000000000000 --- a/bench/memory/named-entity-data.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -const format = require('human-format'); - -main(); - -function main() { - const before = process.memoryUsage().rss; - - require('../../packages/parse5/lib/tokenizer/named-entity-data'); - - const after = process.memoryUsage().rss; - - console.log('Initial memory consumption: ', format(after - before, { unit: 'B' })); -} diff --git a/bench/memory/sax-parser.js b/bench/memory/sax-parser.js index d1e893cf4b5db2c47585fad704b15253df90ed73..0460035ee571736916b2f6bdfd1aafd0102a760b 100644 --- a/bench/memory/sax-parser.js +++ b/bench/memory/sax-parser.js @@ -1,43 +1,36 @@ -'use strict'; - -const fs = require('fs'); -const format = require('human-format'); -const promisifyEvent = require('promisify-event'); -const memwatch = require('node-memwatch'); -const SAXParser = require('../../packages/parse5-sax-parser/lib'); +import { readFile } from 'node:fs/promises'; +import format from 'human-format'; +import memwatch from '@airbnb/node-memwatch'; +import { SAXParser } from '../../packages/parse5-sax-parser/dist/index.js'; +import { finished } from 'parse5-test-utils/dist/common.js'; main(); async function main() { - let parsedDataSize = 0; - let maxMemUsage = 0; - let startDate = null; - let endDate = null; const heapDiffMeasurement = new memwatch.HeapDiff(); - let heapDiff = null; - memwatch.on('stats', stats => { - maxMemUsage = Math.max(maxMemUsage, stats['current_base']); + let maxMemUsage = 0; + + memwatch.on('stats', (stats) => { + maxMemUsage = Math.max(maxMemUsage, stats.used_heap_size); }); - startDate = new Date(); + const statsPromise = new Promise((resolve) => memwatch.once('stats', resolve)); - const parserPromise = parse().then(dataSize => { - parsedDataSize = dataSize; - endDate = new Date(); - heapDiff = heapDiffMeasurement.end(); - }); + const startDate = new Date(); + + const parsedDataSize = await parse(); + const endDate = new Date(); + const heapDiff = heapDiffMeasurement.end(); - await Promise.all([ - parserPromise, - promisifyEvent(memwatch, 'stats') // NOTE: we need at least one `stats` result - ]); + // NOTE: we need at least one `stats` result to get maxMemUsage + await statsPromise; printResults(parsedDataSize, startDate, endDate, heapDiff, maxMemUsage); } async function parse() { - const data = fs.readFileSync('../test/data/huge-page/huge-page.html', 'utf8'); + const data = await readFile(new URL('../../test/data/huge-page/huge-page.html', import.meta.url), 'utf8'); let parsedDataSize = 0; const stream = new SAXParser(); @@ -48,7 +41,7 @@ async function parse() { stream.end(); - await promisifyEvent(stream, 'finish'); + await finished(stream); return parsedDataSize; } @@ -57,16 +50,16 @@ function getDuration(startDate, endDate) { const scale = new format.Scale({ seconds: 1, minutes: 60, - hours: 3600 + hours: 3600, }); - return format((endDate - startDate) / 1000, { scale: scale }); + return format((endDate - startDate) / 1000, { scale }); } function printResults(parsedDataSize, startDate, endDate, heapDiff, maxMemUsage) { console.log('Input data size:', format(parsedDataSize, { unit: 'B' })); - console.log('Duration: ', getDuration(startDate, endDate)); - console.log('Memory before: ', heapDiff.before.size); - console.log('Memory after: ', heapDiff.after.size); - console.log('Memory max: ', format(maxMemUsage, { unit: 'B' })); + console.log('Duration:', getDuration(startDate, endDate)); + console.log('Memory before:', heapDiff.before.size); + console.log('Memory after:', heapDiff.after.size); + console.log('Memory max:', format(maxMemUsage, { unit: 'B' })); } diff --git a/bench/package.json b/bench/package.json index dbb9794b2e40418da86858c044361d61c7ff5165..cd8b234aaea5800b184f6bd1e53f95dae98dd0b6 100644 --- a/bench/package.json +++ b/bench/package.json @@ -1,14 +1,15 @@ { "name": "parse5-benchmarks", + "private": "true", + "type": "module", "version": "1.0.0", "description": "parse5 regression benchmarks", "author": "Ivan Nikulin ", "license": "MIT", "dependencies": { "benchmark": "^2.1.4", - "human-format": "^0.7.0", - "node-memwatch": "^1.0.1", - "parse5": "*", - "promisify-event": "^1.0.0" + "human-format": "^1.0.0", + "@airbnb/node-memwatch": "^2.0.0", + "parse5": "npm:parse5" } } diff --git a/bench/perf/index.js b/bench/perf/index.js index ae87e04963159d50dadabab497a5d6b896e5f7b0..2306eabe056c9755def2567a33bedf4d16421fb1 100644 --- a/bench/perf/index.js +++ b/bench/perf/index.js @@ -1,37 +1,38 @@ -'use strict'; - -const { join } = require('path'); -const { readFileSync, createReadStream, readdirSync } = require('fs'); -const Benchmark = require('benchmark'); -const { loadTreeConstructionTestData } = require('../../test/utils/generate-parsing-tests'); -const loadSAXParserTestData = require('../../test/utils/load-sax-parser-test-data'); -const { treeAdapters, WritableStreamStub } = require('../../test/utils/common'); +import { readFileSync, createReadStream, readdirSync } from 'node:fs'; +import Benchmark from 'benchmark'; +import { loadTreeConstructionTestData } from 'parse5-test-utils/dist/generate-parsing-tests.js'; +import { loadSAXParserTestData } from 'parse5-test-utils/dist/load-sax-parser-test-data.js'; +import { treeAdapters, WritableStreamStub, finished } from 'parse5-test-utils/dist/common.js'; +import * as parse5 from '../../packages/parse5/dist/index.js'; +import { ParserStream as parse5Stream } from '../../packages/parse5-parser-stream/dist/index.js'; +import * as parse5Upstream from 'parse5'; + +const hugePagePath = new URL('../../test/data/huge-page/huge-page.html', import.meta.url); +const treeConstructionPath = new URL('../../test/data/html5lib-tests/tree-construction', import.meta.url); +const saxPath = new URL('../../test/data/sax/', import.meta.url); //HACK: https://github.com/bestiejs/benchmark.js/issues/51 /* global workingCopy, WorkingCopyParserStream, upstreamParser, hugePage, microTests, runMicro, runPages, files */ -global.workingCopy = require('../../packages/parse5/lib'); -global.WorkingCopyParserStream = require('../../packages/parse5-parser-stream/lib'); -global.upstreamParser = require('parse5'); +global.workingCopy = parse5; +global.WorkingCopyParserStream = parse5Stream; +global.upstreamParser = parse5Upstream; // Huge page data -global.hugePage = readFileSync(join(__dirname, '../../test/data/huge-page/huge-page.html')).toString(); +global.hugePage = readFileSync(hugePagePath).toString(); // Micro data -global.microTests = loadTreeConstructionTestData( - [join(__dirname, '../../test/data/html5lib-tests/tree-construction')], - treeAdapters.default -) +global.microTests = loadTreeConstructionTestData(treeConstructionPath, treeAdapters.default) .filter( - test => - //NOTE: this test caused stack overflow in parse5 v1.x + (test) => + //NOTE: this test caused a stack overflow in parse5 v1.x test.input !== '