Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提高JS重复数据消除功能的性能_Javascript_Performance - Fatal编程技术网

Javascript 提高JS重复数据消除功能的性能

Javascript 提高JS重复数据消除功能的性能,javascript,performance,Javascript,Performance,函数是问题来自插件。以下是中的代码: 插件使用返回CSS节点树的。完整的API有很好的文档记录 目前,我在Twitter引导程序上构建了一个大型CSS文件,其中包含许多复杂的选择器。CSS大约需要37秒。如果使用此函数查找并删除任何重复规则,则编译。没有它,只需约3秒 我正在寻求帮助优化此功能以获得更好的性能 更新:我发布的答案复制了函数作者所做的改进。它将编译时间减少了50%以上。我不确定直接在这个函数中找到优化是否容易,似乎这是专业优化的任务,需要构建二叉树等帮助结构。这不是一个简单的问题,

函数是问题来自插件。以下是中的代码:

插件使用返回CSS节点树的。完整的API有很好的文档记录

目前,我在Twitter引导程序上构建了一个大型CSS文件,其中包含许多复杂的选择器。CSS大约需要37秒。如果使用此函数查找并删除任何重复规则,则编译。没有它,只需约3秒

我正在寻求帮助优化此功能以获得更好的性能


更新:我发布的答案复制了函数作者所做的改进。它将编译时间减少了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);
    };
});