Speeds up duplication removal in advanced optimizer.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 22 Mar 2015 16:33:13 +0000 (16:33 +0000)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 22 Mar 2015 16:33:13 +0000 (16:33 +0000)
Instead of calculating id from selector and body it uses selector only
and body in a 2nd pass.

lib/selectors/optimizers/advanced.js

index af9133e..2ed2fc8 100644 (file)
@@ -26,30 +26,38 @@ AdvancedOptimizer.prototype.isSpecial = function (selector) {
 
 AdvancedOptimizer.prototype.removeDuplicates = function (tokens) {
   var matched = {};
-  var forRemoval = [];
+  var moreThanOnce = [];
+  var id, token;
+  var body, bodies;
 
   for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
+    token = tokens[i];
     if (token[0] != 'selector')
       continue;
 
-    var id = stringifyBody(token[2]) + '@' + stringifySelector(token[1]);
-    var alreadyMatched = matched[id];
+    id = stringifySelector(token[1]);
 
-    if (alreadyMatched) {
-      forRemoval.push(alreadyMatched[0]);
-      alreadyMatched.unshift(i);
-    } else {
-      matched[id] = [i];
-    }
+    if (matched[id] && matched[id].length == 1)
+      moreThanOnce.push(id);
+    else
+      matched[id] = matched[id] || [];
+
+    matched[id].push(i);
   }
 
-  forRemoval = forRemoval.sort(function(a, b) {
-    return a > b ? 1 : -1;
-  });
+  for (i = 0, l = moreThanOnce.length; i < l; i++) {
+    id = moreThanOnce[i];
+    bodies = [];
 
-  for (var j = 0, n = forRemoval.length; j < n; j++) {
-    tokens.splice(forRemoval[j] - j, 1);
+    for (var j = matched[id].length - 1; j >= 0; j--) {
+      token = tokens[matched[id][j]];
+      body = stringifyBody(token[2]);
+
+      if (bodies.indexOf(body) > -1)
+        token[2] = [];
+      else
+        bodies.push(body);
+    }
   }
 };