JavaScript中的变量有多昂贵?
JavaScript中的局部变量(JavaScript中的变量有多昂贵?,javascript,performance,Javascript,Performance,JavaScript中的局部变量(var v)、全局变量(window.v)和跨全局变量(parent.v)在主要浏览器中的开销有多大?有没有人在这方面进行过良好的测试?忽略解释器/解析器的优点和缺点,重要的是运行时必须在多大程度上查看作用域链的各个部分 考虑这个简单的例子: foo = 42; // implicitly window.foo; cost: 2 var bar = 3; // cost: 1 function woot(a) { a;
var v
)、全局变量(window.v
)和跨全局变量(parent.v
)在主要浏览器中的开销有多大?有没有人在这方面进行过良好的测试?忽略解释器/解析器的优点和缺点,重要的是运行时必须在多大程度上查看作用域链的各个部分
考虑这个简单的例子:
foo = 42; // implicitly window.foo; cost: 2
var bar = 3; // cost: 1
function woot(a) {
a; // cost: 1
bar; // cost: 2
foo; // cost: 3
var other = 9;// cost: 1
other; // cost: 1
a.something; // cost: 2
foo.win.fail.arg.func(a.something).thing = 0; // cost: 8 + 2
}
woot(bar); // cost: 2 + 1
请记住,函数与变量(我认为)共享相同的名称空间,并且在解析方面与变量类似
使用
foo['bar']
而不是foo.bar
没有额外的成本,除了可能通过Javscript引擎进行的优化(尽管如果要优化后者,如果内容是文字,则应该很容易优化前者)。局部变量对象上始终存在局部范围的变量,“自由”也将如此
要在作用域中访问全局变量,必须遍历作用域链,直到到达全局对象,在[[global]]变量对象上可以找到全局变量。这里的成本取决于链中作用域的数量
在不同的窗口中访问变量时,情况就不同了。大多数较新的浏览器都使用自己的线程和堆栈隔离每个窗口,以提高稳定性,改进垃圾收集,并避免一个窗口线程使整个浏览器崩溃。
对于变量访问来说,这意味着一个窗口中的变量不能被另一个窗口(在不同的堆栈上)直接访问。那么这是如何解决的呢 以Opera为例,一旦一个窗口尝试访问另一个窗口变量,Opera实际上会暂停执行,将两个堆栈和执行环境合并在一起,然后继续执行。
我想你可能会说这很贵:)在什么方面贵?演出记忆?另外,变量包含什么?我敢肯定,一个包含单个整数的变量并不昂贵,但一个包含大数组的变量更昂贵……诅咒这个变量!我想我得重新使用一些变量来省钱…该死。不是三个fiddy@codeka:是的,就性能、内存和其他方面而言。函数在这个意义上被视为变量-它们都被添加到为作用域创建的变量对象中。@Sean Kisney,感谢您的澄清。我知道Javascript的基本工作原理,但我没有读过ECMAScript规范或其他任何东西。这不是我所希望的答案,但很有见地,我从未真正意识到全局变量的成本大约是局部变量的三倍。正如您所说,解析器可能也应该是无关紧要的,因为它们现在每月都在改进。@Tom,如果您有越来越多的作用域(例如,函数中的函数),那么全局解析器的成本将进一步增加,因为它在作用域链上的作用域越来越远。(很多jQuery代码中都有很多作用域)在网页中从不考虑“IPC”;好主意。