JavaScript优化:如何更有效地缓存局部变量的初始值?

时间:2013-07-24 12:41:58

标签: javascript optimization v8 spidermonkey

我只是好奇。也许有人知道2013年JavaScript引擎可以优化哪些内容以及它们不能优化什么?对最近的未来有任何假设吗?我正在寻找一些好文章,但互联网上仍然没有“圣经”。

好的,让我们专注于单一问题:

假设我有一个每10ms或紧密循环调用的函数:

function bottleneck () {

    var str = 'Some string',
        arr = [1,2,3,4],
        job = function () {
            // do something;
        };

    // Do something; 
    // console.log(Date.getTime());
}

如您所见,我不需要每次都计算变量的初始值。但是,如果我将它们移动到较高范围,我将放弃变量查找。那么有没有办法告诉Javasript引擎做这么明显的事情 - 预先计算变量的初始值?

我关心了jsperf to clear my question。我正在尝试不同的类型。我对函数和原语特别感兴趣。

2 个答案:

答案 0 :(得分:1)

如果你需要每隔10ms调用一次函数,这是一个瓶颈,首先想到的应该是“我不应该每隔10ms调用一次这个函数”。你做的架构出了问题。也就是说,请参阅http://jsperf.com/variables-caching/2中的1b,这比您的“缓存”版本快四倍 - 主要原因是对于代码中的每个变量,您要么提升范围,要么重新声明。在1b中,我们将范围提高一次,获得“首字母缩写”,然后根据本地参考设置其内容的本地别名。节省了很多时间。

答案 1 :(得分:1)

(关注V8)

数组数据本身并未创建,但每次都需要创建一个唯一的数组对象。值1,2,3,4的后备数组由这些对象共享。

字符串是interned,实际上最快的是将相同字符串粘贴到文字而不是引用一些常见变量。但是对于维护,你真的不想这样做。

如果你的job函数引用bottleneck函数中的任何变量,那么不要在hot函数内创建任何新函数,那么首先这些变量将变为上下文分配,并且在任何地方都很慢访问在外部函数中它将阻止inlining of the bottleneck function到目前为止。内联是一个很大的优化,你不想错过它。