Skip to content
This repository was archived by the owner on Nov 15, 2017. It is now read-only.

Commit 278ef51

Browse files
committed
performance work
1 parent 88043ca commit 278ef51

File tree

1 file changed

+36
-51
lines changed

1 file changed

+36
-51
lines changed

js/abp-filters.js

Lines changed: 36 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Idle mem after: 120 MB
6666
*/
6767

6868
var filterDict = {};
69-
var filterDictFrozenCount = 0;
69+
var filterCount = 0;
7070
var filterIndex = {};
7171

7272
var reIgnoreFilter = /^\[|^!|##|@#|@@|^\|http/;
@@ -83,12 +83,7 @@ var FilterEntry = function(s, tokenBeg, tokenLen) {
8383
this.s = s;
8484
this.tokenBeg = tokenBeg;
8585
this.tokenLen = tokenLen;
86-
};
87-
88-
FilterEntry.prototype.matchString = function(s, tokenBeg) {
89-
// rhill 2014-03-05: Benchmarking shows that's the fastest way to do this.
90-
var filterBeg = tokenBeg - this.tokenBeg;
91-
return s.indexOf(this.s, filterBeg) === filterBeg;
86+
this.next = undefined;
9287
};
9388

9489
/******************************************************************************/
@@ -97,7 +92,7 @@ FilterEntry.prototype.matchString = function(s, tokenBeg) {
9792

9893
var reset = function() {
9994
filterDict = {};
100-
filterDictFrozenCount = 0;
95+
filterCount = 0;
10196
filterIndex = {};
10297
};
10398

@@ -133,11 +128,6 @@ var findGoodToken = function(s) {
133128
/******************************************************************************/
134129

135130
var add = function(s) {
136-
if ( filterDictFrozenCount !== 0 ) {
137-
console.error("abpFilter.add()> Can't add, I'm frozen!");
138-
return false;
139-
}
140-
141131
// Ignore unsupported filters
142132
if ( reIgnoreFilter.test(s) ) {
143133
return false;
@@ -195,88 +185,83 @@ var add = function(s) {
195185
filter = new FilterEntry(s, tokenBeg, token.length);
196186
filterDict[s] = filter;
197187

198-
var prefixKey = tokenBeg > 0 ? s.charAt(tokenBeg-1) : '0';
199-
var suffixKey = tokenEnd < s.length ? s.charAt(tokenEnd) : '0';
188+
var prefixKey = tokenBeg > 0 ? s.charAt(tokenBeg-1) : '';
189+
var suffixKey = s.substr(tokenEnd, 2);
200190

201191
var fidx = filterIndex;
202192
var tokenKey = prefixKey + token + suffixKey;
203-
var tokenEntry = fidx[tokenKey];
204-
if ( tokenEntry === undefined ) {
205-
fidx[tokenKey] = filter;
206-
} else if ( tokenEntry instanceof FilterEntry ) {
207-
fidx[tokenKey] = [tokenEntry, filter];
208-
} else {
209-
tokenEntry.push(filter);
210-
}
193+
filter.next = fidx[tokenKey];
194+
fidx[tokenKey] = filter;
195+
filterCount += 1;
211196

212197
return true;
213198
};
214199

215200
/******************************************************************************/
216201

217202
var freeze = function() {
218-
filterDictFrozenCount = Object.keys(filterDict).length;
219-
filterDict = null;
203+
filterDict = {};
220204
};
221205

222206
/******************************************************************************/
223207

224-
var matchFromFilterArray = function(s, tokenBeg, tokenEnd, filters) {
225-
var i = filters.length;
226-
while ( i-- ) {
227-
if ( filters[i].matchString(s, tokenBeg) ) {
228-
return true;
208+
var matchStringToFilterChain = function(filter, s, tokenBeg) {
209+
var filterBeg;
210+
while ( filter ) {
211+
// rhill 2014-03-05: Benchmarking shows that's the fastest way to do this.
212+
filterBeg = tokenBeg - filter.tokenBeg;
213+
if ( s.indexOf(filter.s, filterBeg) === filterBeg ) {
214+
return true
229215
}
216+
filter = filter.next;
230217
}
231218
return false;
232219
};
233220

234221
/******************************************************************************/
235222

236-
var matchFromSomething = function(s, tokenBeg, tokenEnd, something) {
237-
if ( something === undefined ) {
238-
return false;
239-
}
240-
if ( something instanceof FilterEntry ) {
241-
return something.matchString(s, tokenBeg);
242-
}
243-
return matchFromFilterArray(s, tokenBeg, tokenEnd, something);
244-
};
245-
246-
/******************************************************************************/
247-
248223
var matchString = function(s) {
249-
var sLen = s.length;
224+
var fidx = filterIndex;
250225
var matches;
251226
var token;
252227
var tokenBeg, tokenEnd;
253228
var prefixKey, suffixKey;
254-
var fidx = filterIndex;
229+
var matchFn = matchStringToFilterChain;
255230

256231
reToken.lastIndex = 0;
257232
while ( matches = reToken.exec(s) ) {
258233
token = matches[0];
259234
tokenBeg = matches.index;
260235
tokenEnd = reToken.lastIndex;
261-
prefixKey = tokenBeg > 0 ? s.charAt(matches.index-1) : false;
262-
suffixKey = tokenEnd < sLen ? s.charAt(tokenEnd) : false;
236+
prefixKey = tokenBeg > 0 ? s.charAt(matches.index-1) : '';
237+
suffixKey = s.substr(tokenEnd, 2);
263238

239+
if ( prefixKey && suffixKey.length > 1 ) {
240+
if ( matchFn(fidx[prefixKey + token + suffixKey], s, tokenBeg) ) {
241+
return true;
242+
}
243+
}
264244
if ( prefixKey && suffixKey ) {
265-
if ( matchFromSomething(s, tokenBeg, tokenEnd, fidx[prefixKey + token + suffixKey]) ) {
245+
if ( matchFn(fidx[prefixKey + token + suffixKey.charAt(0)], s, tokenBeg) ) {
266246
return true;
267247
}
268248
}
269249
if ( prefixKey ) {
270-
if ( matchFromSomething(s, tokenBeg, tokenEnd, fidx[prefixKey + token + '0']) ) {
250+
if ( matchFn(fidx[prefixKey + token], s, tokenBeg) ) {
251+
return true;
252+
}
253+
}
254+
if ( suffixKey.length > 1 ) {
255+
if ( matchFn(fidx[token + suffixKey], s, tokenBeg) ) {
271256
return true;
272257
}
273258
}
274259
if ( suffixKey ) {
275-
if ( matchFromSomething(s, tokenBeg, tokenEnd, fidx['0' + token + suffixKey]) ) {
260+
if ( matchFn(fidx[token + suffixKey.charAt(0)], s, tokenBeg) ) {
276261
return true;
277262
}
278263
}
279-
if ( matchFromSomething(s, tokenBeg, tokenEnd, fidx['0' + token + '0']) ) {
264+
if ( matchFn(fidx[token], s, tokenBeg) ) {
280265
return true;
281266
}
282267
}
@@ -287,7 +272,7 @@ var matchString = function(s) {
287272
/******************************************************************************/
288273

289274
var getFilterCount = function() {
290-
return filterDictFrozenCount;
275+
return filterCount;
291276
};
292277

293278
/******************************************************************************/

0 commit comments

Comments
 (0)