| Index: lib/matcher.js |
| =================================================================== |
| --- a/lib/matcher.js |
| +++ b/lib/matcher.js |
| @@ -243,17 +243,17 @@ |
| * rules into two Matcher instances. |
| * @constructor |
| * @augments Matcher |
| */ |
| function CombinedMatcher() |
| { |
| this.blacklist = new Matcher(); |
| this.whitelist = new Matcher(); |
| - this.resultCache = Object.create(null); |
| + this.resultCache = new Map(); |
| } |
| exports.CombinedMatcher = CombinedMatcher; |
| /** |
| * Maximal number of matching cache entries to be kept |
| * @type {number} |
| */ |
| CombinedMatcher.maxCacheEntries = 1000; |
| @@ -269,71 +269,56 @@ |
| /** |
| * Matcher for exception rules. |
| * @type {Matcher} |
| */ |
| whitelist: null, |
| /** |
| * Lookup table of previous matchesAny results |
| - * @type {Object} |
| + * @type {Map.<string,Filter>} |
| */ |
| resultCache: null, |
| /** |
| - * Number of entries in resultCache |
|
Manish Jethani
2018/03/10 15:54:37
There's no need for cacheEntries anymore.
|
| - * @type {number} |
| - */ |
| - cacheEntries: 0, |
| - |
| - /** |
| * @see Matcher#clear |
| */ |
| clear() |
| { |
| this.blacklist.clear(); |
| this.whitelist.clear(); |
| - this.resultCache = Object.create(null); |
| - this.cacheEntries = 0; |
| + this.resultCache.clear(); |
| }, |
| /** |
| * @see Matcher#add |
| * @param {Filter} filter |
| */ |
| add(filter) |
| { |
| if (filter instanceof WhitelistFilter) |
| this.whitelist.add(filter); |
| else |
| this.blacklist.add(filter); |
| - if (this.cacheEntries > 0) |
| - { |
| - this.resultCache = Object.create(null); |
| - this.cacheEntries = 0; |
| - } |
| + this.resultCache.clear(); |
|
Manish Jethani
2018/03/10 15:54:37
We don't have to check the size here because we're
sergei
2018/03/12 12:03:00
I'm pretty sure that now it's even faster, tough i
|
| }, |
| /** |
| * @see Matcher#remove |
| * @param {Filter} filter |
| */ |
| remove(filter) |
| { |
| if (filter instanceof WhitelistFilter) |
| this.whitelist.remove(filter); |
| else |
| this.blacklist.remove(filter); |
| - if (this.cacheEntries > 0) |
| - { |
| - this.resultCache = Object.create(null); |
| - this.cacheEntries = 0; |
| - } |
| + this.resultCache.clear(); |
| }, |
| /** |
| * @see Matcher#findKeyword |
| * @param {Filter} filter |
| * @return {string} keyword |
| */ |
| findKeyword(filter) |
| @@ -419,30 +404,28 @@ |
| /** |
| * @see Matcher#matchesAny |
| * @inheritdoc |
| */ |
| matchesAny(location, typeMask, docDomain, thirdParty, sitekey, specificOnly) |
| { |
| let key = location + " " + typeMask + " " + docDomain + " " + thirdParty + |
| " " + sitekey + " " + specificOnly; |
| - if (key in this.resultCache) |
| - return this.resultCache[key]; |
| - let result = this.matchesAnyInternal(location, typeMask, docDomain, |
| - thirdParty, sitekey, specificOnly); |
| + let result = this.resultCache.get(key); |
| + if (result !== undefined) |
|
Manish Jethani
2018/03/10 15:54:37
Assumption: an entry will never have a value of un
sergei
2018/03/12 12:03:01
AFAIK our coding style says to rather use `typeof
Manish Jethani
2018/03/12 13:42:42
This is really not about coding style. The cache c
sergei
2018/03/12 17:48:31
Please take a look around in this file, whenever o
Manish Jethani
2018/03/12 18:59:21
Done.
sergei
2018/03/13 13:56:41
I still think we should discuss whether we use typ
Manish Jethani
2018/03/13 14:32:49
Yes, let's have that discussion.
|
| + return result; |
| - if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) |
| - { |
| - this.resultCache = Object.create(null); |
| - this.cacheEntries = 0; |
| - } |
| + result = this.matchesAnyInternal(location, typeMask, docDomain, |
| + thirdParty, sitekey, specificOnly); |
| - this.resultCache[key] = result; |
| - this.cacheEntries++; |
| + if (this.resultCache.size >= CombinedMatcher.maxCacheEntries) |
|
Manish Jethani
2018/03/10 15:54:37
Again, we don't have to create a new object every
|
| + this.resultCache.clear(); |
| + |
| + this.resultCache.set(key, result); |
| return result; |
| } |
| }; |
| /** |
| * Shared CombinedMatcher instance that should usually be used. |
| * @type {CombinedMatcher} |