diff --git a/src/vs/base/common/scorer.ts b/src/vs/base/common/scorer.ts index 1c6435fddbd856735e3c839643fa8bd36dd6d937..998e63bc671e0b44be9d638ed37fa403930b5b11 100644 --- a/src/vs/base/common/scorer.ts +++ b/src/vs/base/common/scorer.ts @@ -31,13 +31,18 @@ * Start of word/path bonus: 7 * Start of string bonus: 8 */ -export function score(target: string, query: string): number { +export function score(target: string, query: string, cache?: {[id: string]: number}): number { let score = 0; if (!target || !query) { return score; // return early if target or query are undefined } + const cached = cache && cache[target + query]; + if (typeof cached === 'number') { + return cached; + } + const queryLen = query.length; const targetLower = target.toLowerCase(); const queryLower = query.toLowerCase(); @@ -77,6 +82,10 @@ export function score(target: string, query: string): number { index++; } + if (cache) { + cache[target + query] = score; + } + return score; } diff --git a/src/vs/base/test/common/scorer.test.ts b/src/vs/base/test/common/scorer.test.ts index 6de190abcbaeca9228396b698556860cdfbd8598..1340aec2eda2d5018299f5f81c0eca7e4d4c9f5b 100644 --- a/src/vs/base/test/common/scorer.test.ts +++ b/src/vs/base/test/common/scorer.test.ts @@ -32,4 +32,12 @@ suite('Scorer', () => { let sortedScores = scores.sort(); assert.deepEqual(scores.reverse(), sortedScores); }); + + test("cache", function() { + const cache = Object.create(null); + + scorer.score('target', 'query', cache); + + assert.ok(Object.getOwnPropertyNames(cache).length > 0); + }); }); \ No newline at end of file diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index 51916d63169a181aa1d41d87ad5362ce24f74a5b..a44938128f9b8e36a6f4d79173cd00565640876f 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -45,6 +45,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { private delayer: ThrottledDelayer; private pendingSearch: TPromise; private isClosed: boolean; + private scorerCache: {[key: string]: number}; private fuzzyMatchingEnabled: boolean; private configurationListenerUnbind: ListenerUnbind; @@ -64,6 +65,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { this.openFileHandler.setStandalone(false); this.resultsToSearchCache = Object.create(null); + this.scorerCache = Object.create(null); this.delayer = new ThrottledDelayer(OpenAnythingHandler.SEARCH_DELAY); this.updateFuzzyMatching(contextService.getOptions().globalSettings.settings); @@ -293,15 +295,15 @@ export class OpenAnythingHandler extends QuickOpenHandler { // Fuzzy scoring is special if (enableFuzzyScoring) { - const labelAScore = scorer.score(elementA.getLabel(), lookFor); - const labelBScore = scorer.score(elementB.getLabel(), lookFor); + const labelAScore = scorer.score(elementA.getLabel(), lookFor, this.scorerCache); + const labelBScore = scorer.score(elementB.getLabel(), lookFor, this.scorerCache); if (labelAScore !== labelBScore) { return labelAScore > labelBScore ? -1 : 1; } - const descriptionAScore = scorer.score(elementA.getDescription(), lookFor); - const descriptionBScore = scorer.score(elementB.getDescription(), lookFor); + const descriptionAScore = scorer.score(elementA.getDescription(), lookFor, this.scorerCache); + const descriptionBScore = scorer.score(elementB.getDescription(), lookFor, this.scorerCache); if (descriptionAScore !== descriptionBScore) { return descriptionAScore > descriptionBScore ? -1 : 1; @@ -329,6 +331,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { // Clear Cache this.resultsToSearchCache = Object.create(null); + this.scorerCache = Object.create(null); // Propagate this.openSymbolHandler.onClose(canceled);