From: Jakub Pawlowicz Date: Sun, 22 Mar 2015 16:33:13 +0000 (+0000) Subject: Speeds up duplication removal in advanced optimizer. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=2f3c9dac25fcdff0caa8ff26234458945ebfea91;p=clean-css.git Speeds up duplication removal in advanced optimizer. Instead of calculating id from selector and body it uses selector only and body in a 2nd pass. --- diff --git a/lib/selectors/optimizers/advanced.js b/lib/selectors/optimizers/advanced.js index af9133ea..2ed2fc82 100644 --- a/lib/selectors/optimizers/advanced.js +++ b/lib/selectors/optimizers/advanced.js @@ -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); + } } };