From abfb2321b6ce390a38ab3b927246e4175ad7e712 Mon Sep 17 00:00:00 2001 From: Craig Spence Date: Wed, 27 Feb 2019 18:03:17 +1300 Subject: [PATCH 1/2] Add memo cache to improve performance of repeated parse calls --- esquery.js | 10 ++++++++-- tests/parser.js | 9 +++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/esquery.js b/esquery.js index 97407ff..f2de80e 100644 --- a/esquery.js +++ b/esquery.js @@ -1,6 +1,5 @@ /* vim: set sw=4 sts=4 : */ (function () { - var estraverse = require('estraverse'); var parser = require('./parser'); @@ -8,6 +7,8 @@ return {}.toString.call(array) === '[object Array]'; }; + var PARSE_CACHE = {}; + var LEFT_SIDE = {}; var RIGHT_SIDE = {}; @@ -312,7 +313,12 @@ * Parse a selector string and return its AST. */ function parse(selector) { - return parser.parse(selector); + if (PARSE_CACHE[selector]) { + return PARSE_CACHE[selector]; + } + var parsed = parser.parse(selector); + PARSE_CACHE[selector] = parsed; + return parsed; } /** diff --git a/tests/parser.js b/tests/parser.js index d79f093..3247081 100644 --- a/tests/parser.js +++ b/tests/parser.js @@ -2,7 +2,8 @@ define([ "esquery", "jstestr/assert", "jstestr/test", -], function (esquery, assert, test) { + "perf_hooks" +], function (esquery, assert, test, performance) { test.defineSuite("basic query parsing", { @@ -18,7 +19,11 @@ define([ assert.isNotEqual(void 0, esquery.parse("A ")); assert.isNotEqual(void 0, esquery.parse(" A ")); assert.isNotEqual(void 0, esquery.parse(" A ")); - } + }, + "memoize selector parsing": function () { + assert.isEqual(JSON.stringify(esquery.parse("A")) === JSON.stringify(esquery.parse("A")), true); + assert.isEqual(esquery.parse("A") === esquery.parse("A"), true); + } }); }); From 7d95ac960e58d9cf5577eb953a07df187ce4708b Mon Sep 17 00:00:00 2001 From: Craig Spence Date: Wed, 27 Feb 2019 18:04:21 +1300 Subject: [PATCH 2/2] Remove leftover test code --- tests/parser.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/parser.js b/tests/parser.js index 3247081..de58d2c 100644 --- a/tests/parser.js +++ b/tests/parser.js @@ -1,9 +1,8 @@ define([ "esquery", "jstestr/assert", - "jstestr/test", - "perf_hooks" -], function (esquery, assert, test, performance) { + "jstestr/test" +], function (esquery, assert, test) { test.defineSuite("basic query parsing", {