Javascript 提高JS重复数据消除功能的性能
函数是问题来自插件。以下是中的代码: 插件使用返回CSS节点树的。完整的API有很好的文档记录 目前,我在Twitter引导程序上构建了一个大型CSS文件,其中包含许多复杂的选择器。CSS大约需要37秒。如果使用此函数查找并删除任何重复规则,则编译。没有它,只需约3秒 我正在寻求帮助优化此功能以获得更好的性能Javascript 提高JS重复数据消除功能的性能,javascript,performance,Javascript,Performance,函数是问题来自插件。以下是中的代码: 插件使用返回CSS节点树的。完整的API有很好的文档记录 目前,我在Twitter引导程序上构建了一个大型CSS文件,其中包含许多复杂的选择器。CSS大约需要37秒。如果使用此函数查找并删除任何重复规则,则编译。没有它,只需约3秒 我正在寻求帮助优化此功能以获得更好的性能 更新:我发布的答案复制了函数作者所做的改进。它将编译时间减少了50%以上。我不确定直接在这个函数中找到优化是否容易,似乎这是专业优化的任务,需要构建二叉树等帮助结构。这不是一个简单的问题,
更新:我发布的答案复制了函数作者所做的改进。它将编译时间减少了50%以上。我不确定直接在这个函数中找到优化是否容易,似乎这是专业优化的任务,需要构建二叉树等帮助结构。这不是一个简单的问题,问题在算法中,而不是在实现中。 如果您只想优化代码-尝试合并
过滤器
和forEach
。至少,这将有助于避免双重迭代
var last = null;
var nodes = node.parent.nodes.forEach(function(n){
if (String(n) === String(node)) {
if (last) {
last.removeSelf();
}
last = n;
}
});
我向回购所有人汇报了情况,他在业绩方面做了一些重大改进。我的编译时间现在约为13.5秒。(通过添加有问题的评论中提到的微优化,我也成功地去除了传统的第二个)
这是改进的代码:
'use strict';
var postcss = require('postcss');
function dedupe (node, index) {
if (node.type === 'comment') { return; }
if (node.nodes) { node.each(dedupe); }
var toString = node.toString();
var nodes = node.parent.nodes;
var result = [node];
var i = index + 1;
var max = nodes.length;
for (; i < max; i++) {
if (nodes[i].toString() === toString) {
result.push(nodes[i]);
}
}
for (var x = 0; x < result.length; x++) {
if (x !== result.length - 1) {
result[x].remove();
}
}
}
module.exports = postcss.plugin('postcss-discard-duplicates', function () {
return function (css) {
css.each(dedupe);
};
});
“严格使用”;
var POSTSS=要求(“POSTSS”);
功能重复数据消除(节点、索引){
if(node.type==='comment'){return;}
if(node.nodes){node.each(重复数据消除);}
var-toString=node.toString();
var节点=node.parent.nodes;
var结果=[node];
var i=指数+1;
var max=nodes.length;
对于(;i
为了补充@Danila所说的,通过优化此代码,您可能只能获得少量性能提升。当然,在大数据集上,这可能会有所不同。在细节部分,您可以做的另外两个优化是使用基本for循环而不是forEach。稍微快一点。此外,您还可以使用toString代替String,因为String最终会调用toString。
'use strict';
var postcss = require('postcss');
function dedupe (node, index) {
if (node.type === 'comment') { return; }
if (node.nodes) { node.each(dedupe); }
var toString = node.toString();
var nodes = node.parent.nodes;
var result = [node];
var i = index + 1;
var max = nodes.length;
for (; i < max; i++) {
if (nodes[i].toString() === toString) {
result.push(nodes[i]);
}
}
for (var x = 0; x < result.length; x++) {
if (x !== result.length - 1) {
result[x].remove();
}
}
}
module.exports = postcss.plugin('postcss-discard-duplicates', function () {
return function (css) {
css.each(dedupe);
};
});