0

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

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

假设我有一个每 10 毫秒调用一次或在一个紧密循环中调用的函数:

function bottleneck () {

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

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

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

我已经照顾了一个jsperf 来解决我的问题。我正在尝试不同的类型。我对函数和原语特别感兴趣。

4

2 回答 2

1

(关注V8)

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

该字符串是实习的,实际上将相同的字符串复制粘贴到任何地方作为文字而不是引用一些公共变量是最快的。但是对于维护,您并不想这样做。

不要在热函数中创建任何新函数,如果您的job函数引用函数中的任何变量,bottleneck那么首先这些变量将成为上下文分配的并且即使在外部函数中也无法访问任何地方,并且它将防止瓶颈函数的内联 截至目前。内联是一个重要的优化,如果可能的话,你不想错过。

于 2013-08-01T11:00:13.397 回答
1

如果您需要每 10 毫秒调用一次函数,并且这是一个瓶颈,那么您应该首先想到的是“我不应该每 10 毫秒调用一次这个函数”。你做的架构出了点问题。也就是说,请参阅http://jsperf.com/variables-caching/2中的 1b ,它比“缓存”版本快大约四倍 - 主要原因是对于代码中的每个变量,你要么在移动扩大范围,或重新声明。在 1b 中,我们扩大范围一次,以获取“首字母”,然后从本地引用为其内容设置本地别名。节省了很多时间。

于 2013-07-24T14:28:26.417 回答