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

Commit daab5b0

Browse files
committed
browser optimizer works best if tight loops are confined to less crowded context I suppose
1 parent 6abe73f commit daab5b0

File tree

2 files changed

+32
-40
lines changed

2 files changed

+32
-40
lines changed

doc/img/onbeforerequest-perf.png

92 Bytes
Loading

js/abp-filters.js

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ var reIgnoreComment = /^\[|^!/;
6666
var reHostnameRule = /^[0-9a-z.-]+[0-9a-z]$/;
6767
var reHostnameToken = /^[0-9a-z]+/g;
6868
var reGoodToken = /[%0-9a-z]{2,}/g;
69-
var reAnyToken = /[%0-9a-z]+/g;
7069

7170
var typeNameToTypeValue = {
7271
'stylesheet': 2 << 11,
@@ -682,6 +681,8 @@ var FilterContainer = function() {
682681

683682
// Used during URL matching
684683
this.categoryBuckets = new Array(8);
684+
this.reAnyToken = /[%0-9a-z]+/g;
685+
this.reMatches;
685686
};
686687

687688
/******************************************************************************/
@@ -1053,8 +1054,8 @@ FilterContainer.prototype.freeze = function() {
10531054

10541055
FilterContainer.prototype.matchToken = function(categoryBucket) {
10551056
var url = this.url;
1056-
var beg = this.tokenBeg;
1057-
var end = this.tokenEnd;
1057+
var beg = this.reMatches.index;
1058+
var end = this.reAnyToken.lastIndex;
10581059
var right = url.length - end;
10591060
var f;
10601061

@@ -1097,6 +1098,31 @@ FilterContainer.prototype.matchToken = function(categoryBucket) {
10971098

10981099
/******************************************************************************/
10991100

1101+
FilterContainer.prototype.matchTokens = function() {
1102+
var buckets = this.categoryBuckets;
1103+
var url = this.url;
1104+
var re = this.reAnyToken;
1105+
var i, bucket, f;
1106+
1107+
re.lastIndex = 0;
1108+
while ( this.reMatches = re.exec(url) ) {
1109+
i = 8;
1110+
while ( i-- ) {
1111+
bucket = buckets[i];
1112+
if ( bucket === undefined ) {
1113+
continue;
1114+
}
1115+
f = this.matchToken(bucket);
1116+
if ( f !== false ) {
1117+
return f;
1118+
}
1119+
}
1120+
}
1121+
return false;
1122+
};
1123+
1124+
/******************************************************************************/
1125+
11001126
FilterContainer.prototype.matchString = function(pageStats, url, requestType, requestHostname) {
11011127
// adbProfiler.countUrl();
11021128
// adbProfiler.testCounter(true);
@@ -1119,7 +1145,6 @@ FilterContainer.prototype.matchString = function(pageStats, url, requestType, re
11191145
// This helps performance compared to testing against both classes of
11201146
// filters in the same loop.
11211147

1122-
var matches;
11231148
var pageDomain = pageStats.pageDomain;
11241149
var party = requestHostname.slice(-pageDomain.length) === pageDomain ?
11251150
FirstParty :
@@ -1132,7 +1157,6 @@ FilterContainer.prototype.matchString = function(pageStats, url, requestType, re
11321157

11331158
var categories = this.categories;
11341159
var categoryBuckets = this.categoryBuckets;
1135-
var i, categoryBucket;
11361160

11371161
// Test against block filters
11381162
categoryBuckets[7] = categories[this.makeCategoryKey(BlockAnyTypeAnyParty)];
@@ -1144,27 +1168,7 @@ FilterContainer.prototype.matchString = function(pageStats, url, requestType, re
11441168
categoryBuckets[1] = categories[this.makeCategoryKey(BlockOneParty | type | domainParty)];
11451169
categoryBuckets[0] = categories[this.makeCategoryKey(BlockOtherParties | type | domainParty)];
11461170

1147-
var bf = false;
1148-
1149-
reAnyToken.lastIndex = 0;
1150-
while ( matches = reAnyToken.exec(url) ) {
1151-
this.tokenBeg = matches.index;
1152-
this.tokenEnd = reAnyToken.lastIndex;
1153-
i = 8;
1154-
while ( i-- ) {
1155-
categoryBucket = categoryBuckets[i];
1156-
if ( categoryBucket === undefined ) {
1157-
continue;
1158-
}
1159-
bf = this.matchToken(categoryBucket);
1160-
if ( bf !== false ) {
1161-
break;
1162-
}
1163-
}
1164-
if ( bf !== false ) {
1165-
break;
1166-
}
1167-
}
1171+
var bf = this.matchTokens();
11681172

11691173
// If there was no block filter, no need to test against allow filters
11701174
if ( bf === false ) {
@@ -1181,20 +1185,8 @@ FilterContainer.prototype.matchString = function(pageStats, url, requestType, re
11811185
categoryBuckets[1] = categories[this.makeCategoryKey(AllowOneParty | type | domainParty)];
11821186
categoryBuckets[0] = categories[this.makeCategoryKey(AllowOtherParties | type | domainParty)];
11831187

1184-
reAnyToken.lastIndex = 0;
1185-
while ( matches = reAnyToken.exec(url) ) {
1186-
this.tokenBeg = matches.index;
1187-
this.tokenEnd = reAnyToken.lastIndex;
1188-
i = 8;
1189-
while ( i-- ) {
1190-
categoryBucket = categoryBuckets[i];
1191-
if ( categoryBucket === undefined ) {
1192-
continue;
1193-
}
1194-
if ( this.matchToken(categoryBucket) !== false ) {
1195-
return false;
1196-
}
1197-
}
1188+
if ( this.matchTokens() !== false ) {
1189+
return false;
11981190
}
11991191

12001192
return bf;

0 commit comments

Comments
 (0)