UNPKG

acorn

Version:

ECMAScript parser

91 lines (81 loc) 3.2 kB
<!doctype html> <head> <meta charset="utf-8"> <title>Acorn benchmark</title> <script src="../acorn.js"></script> <script src="compare/esprima.js"></script> <script src="compare/uglifyjs2.js"></script> <script src="jquery-string.js"></script> <script src="codemirror-string.js"></script> <style> td { text-align: right; padding-right: 20px; } th { text-align: left; padding-right: 40px; } body { max-width: 50em; padding: 1em 2em; } h1 { font-size: 150%; } </style> </head> <h1>Acorn/Esprima/UglifyJS2 speed comparison</h1> <p>This will run each of the three parsers on the source code of jQuery 1.6.4 and CodeMirror 3.0b1 for two seconds, and show a table indicating the number of lines parsed per second. Note that UglifyJS always stores location data, and is thus not fairly compared by the benchmark <em>without</em> location data.<p> <p>Also note that having the developer tools open in Chrome, or Firebug in Firefox <em>heavily</em> influences the numbers you get. In Chrome, the effect even lingers (in the tab) after you close the developer tools. Load in a fresh tab to get (halfway) stable numbers.</p> <button onclick="run(false)">Compare <strong>without</strong> location data</button> <button onclick="run(true)">Compare <strong>with</strong> location data</button> <button onclick="run(false, true)">Run only Acorn</button> <span id="running"></span> <script> function runAcorn(code, locations) { acorn.parse(code, {locations: locations}); } function runEsprima(code, locations) { esprima.parse(code, {loc: locations}); } function runUglifyJS(code) { uglifyjs.parse(code); } var totalLines = codemirror30.split("\n").length + jquery164.split("\n").length; function benchmark(runner, locations) { // Give it a chance to warm up (first runs are usually outliers) runner(jquery164, locations); runner(codemirror30, locations); var t0 = +new Date, t1, lines = 0; for (;;) { runner(jquery164, locations); runner(codemirror30, locations); lines += totalLines; t1 = +new Date; if (t1 - t0 > 2000) break; } return lines / ((t1 - t0) / 1000); } function showOutput(values) { var html = "<hr><table>"; for (var i = 0; i < values.length; ++i) html += "<tr><th>" + values[i].name + "</td><td>" + Math.round(values[i].score) + " lines per second</td><td>" + Math.round(values[i].score * 100 / values[0].score) + "%</td></tr>"; document.body.appendChild(document.createElement("div")).innerHTML = html; } function run(locations, acornOnly) { var running = document.getElementById("running"); running.innerHTML = "Running benchmark..."; var data = [{name: "Acorn", runner: runAcorn}, {name: "Esprima", runner: runEsprima}, {name: "UglifyJS2", runner: runUglifyJS}]; if (acornOnly) data.length = 1; var pos = 0; function next() { data[pos].score = benchmark(data[pos].runner, locations); if (++pos == data.length) { running.innerHTML = ""; showOutput(data); } else setTimeout(next, 100); } setTimeout(next, 50); } </script>