JavaScript优化:如何缓存本地变量'初始值更有效

JavaScript optimizations: how to cache local variables' initial values more efficiently?

本文关键字:变量 有效 优化 何缓存 缓存 JavaScript      更新时间:2023-09-26

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

好的,让我们集中讨论单个问题:

假设我有一个函数,每10ms调用一次,或者在一个紧循环中调用一次:

function bottleneck () {
    var str = 'Some string',
        arr = [1,2,3,4],
        job = function () {
            // do something;
        };
    // Do something; 
    // console.log(Date.getTime());
}

正如您所看到的,我不需要每次都计算变量的初始值。但是,如果我把它们移到更高的范围,我将在变量查找上放松。那么,有没有一种方法可以告诉Javasrpt引擎做这样一件显而易见的事情——预先计算变量的初始值?

为了澄清我的问题,我特意做了一个jsperf。我正在尝试不同的类型。我对函数和基元特别感兴趣。

如果你需要每10ms调用一个函数,而这是一个瓶颈,你应该首先想到的是"我不应该每10ms就调用这个函数"。你做的架构出了问题。也就是说,参见中的1bhttp://jsperf.com/variables-caching/2,这大约比"缓存"版本快四倍,主要原因是对于代码中的每个变量,要么向上移动,要么重新声明。在1b中,我们向上移动一次范围,以获得"首字母",然后根据本地引用为其内容设置本地别名。节省了很多时间。

(关注V8)

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

字符串是中间的,实际上最快的方法是将相同的字符串作为文本到处复制粘贴,而不是引用一些公共变量。但对于维护,你并不真的想这么做。

不要在热函数中创建任何新函数,如果job函数引用了bottleneck函数中的任何变量,那么首先这些变量将成为上下文分配的,访问任何地方都很慢,即使是在外部函数中,这将阻止瓶颈函数的内联。内衬是一个大的优化,你不想错过其他可能的时候。