繁体   English   中英

如何在JavaScript中制作最快的自底向上树形转换器? 我应该自己管理内存吗?

[英]How to make the fastest possible bottom-up tree transformer in JavaScript? Should I manage memory on my own?

我正在用JavaScript实现自底向上的树形转换器。 它将用于超级组合程序化简器的解释器,因此该算法必须尽可能快,因为它会影响基于它的每个程序。 这是我当前的实现:

function transform(tree,fn){
    var root = tree,
        node = tree,
        child,
        parent,
        is_node,
        dir;
    root.dir = 0;
    while(true) {
        is_node = typeof(node)==="object";
        dir = is_node ? node.dir : 2;
        if (dir < 2)
            child = node[dir],
            node.dir++,
            child.parent = parent = node,
            child.dir = 0,
            node = child;
        else if ((changed = fn(node))!==undefined)
            changed.parent = parent,
            changed.dir = 0,
            node = changed;
        else
            if (!parent)
                return node;
            else
                parent[parent.dir-1] = node,
                node = parent,
                parent = node.parent;
    };
};

// TEST
var tree = [[1,2],[[3,4],[5,6]]];
console.log(
    JSON.stringify(transform(tree,function(a){
        if (a[0]===1) return [3,[5,5]];
        if (a[0]===5) return 77;
    })) === "[[3,77],[[3,4],77]]");

这显然远非最佳。 如何使变压器尽可能快? 也许不用寻找更快的算法,我可以自己管理内存,并使用asm.js

您有两种选择,从最简单但最慢的到最快但最棘手的。

使用常规JavaScript

这是您目前正在执行的操作。 查看您的算法,我看不出有什么可以真正建议的,除了速度微不足道的提高之外,还没有什么其他建议。

使用asm.js

使用asm.js可能是您的选择。 这样可以提高速度。 您无需深入了解该系统的使用位置,但是,如果它可以正常工作,那么实现这样的东西并不难。 您可能会看到性能提高,但是取决于您打算如何使用它,它可能并没有您想要的那么大(对于类似的东西,您可能会看到速度提高了50%-500%,取决于代码的效率)。

用另一种经过编译的打字语言来构建它。

如果速度确实很高,则取决于您的用例,最好用另一种编译后的语言编写此程序(或至少此函数)。 然后,您可以在服务器上运行此编译脚本,并通过Web服务与之通信。

如果您需要在短时间内转换树的次数非常多,那么由于发送和接收数据所花费的时间就不会有太大的提升。 但是,如果您只进行很少的但需要长时间运行的树转换,则可以看到性能上的巨大好处。 编译后的类型化语言(C ++,Java等)将始终比诸如JavaScript这样的解释性无类型语言具有更好的性能。

在服务器上运行它的另一个好处是,您通常可以对其施加更多的功能,因为您可以将其编写为多线程,甚至可以在一组机器上运行,而不是仅在一台机器上运行(对于高端版本) )。 使用JavaScript,通常只限于一个线程,最终用户计算机也只能使用一个线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM