我只是好奇。也许有人知道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。我正在尝试不同的类型。我对函数和原语特别感兴趣。
答案 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到目前为止。内联是一个很大的优化,你不想错过它。