benchmark.mjs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { parser } from '../../frontend/js/features/source-editor/lezer-latex/latex.mjs'
  2. import * as fs from 'node:fs'
  3. import * as path from 'node:path'
  4. import { fileURLToPath } from 'node:url'
  5. import minimist from 'minimist'
  6. const argv = minimist(process.argv.slice(2))
  7. const NUMBER_OF_OPS = argv.ops || 100
  8. const CSV_OUTPUT = argv.csv || false
  9. const __dirname = path.dirname(fileURLToPath(import.meta.url))
  10. const examplesDir = path.join(
  11. __dirname,
  12. '../../test/unit/src/LezerLatex/examples'
  13. )
  14. const strictParser = parser.configure({ strict: true }) // throw exception for invalid documents
  15. if (!fs.existsSync(examplesDir)) {
  16. console.error('No examples directory')
  17. process.exit()
  18. }
  19. function dumpParserStats(parser) {
  20. console.log('Parser size:')
  21. console.dir({
  22. states: parser.states.length,
  23. data: parser.data.length,
  24. goto: parser.goto.length,
  25. })
  26. }
  27. dumpParserStats(strictParser)
  28. const folder = examplesDir
  29. for (const file of fs.readdirSync(folder).sort()) {
  30. if (!/\.tex$/.test(file)) continue
  31. const name = /^[^.]*/.exec(file)[0]
  32. const content = fs.readFileSync(path.join(folder, file), 'utf8')
  33. benchmark(name, content)
  34. }
  35. function benchmark(name, content) {
  36. let timeSum = 0
  37. try {
  38. for (let i = 0; i < NUMBER_OF_OPS; ++i) {
  39. const startTime = performance.now()
  40. strictParser.parse(content)
  41. const endTime = performance.now()
  42. timeSum += endTime - startTime
  43. }
  44. const avgTime = timeSum / NUMBER_OF_OPS
  45. if (CSV_OUTPUT) {
  46. console.log(`${name},${avgTime.toFixed(2)},${content.length}`)
  47. } else {
  48. console.log(
  49. `${name.padEnd(20)} time to run (ms):\t ${avgTime.toFixed(2)}`
  50. )
  51. }
  52. } catch (error) {
  53. console.error(`${name.padEnd(20)} ${error}`)
  54. }
  55. }