pin*_*fei 6 javascript let node.js
在node.js v6.0.0中
function testlet() {
let a = 0;
for (var i = 0; i < 100000000; i++) {}
}
function testlet2() {
for (var i = 0; i < 100000000; i++) {}
let a = 0;
}
console.time('let');
testlet();
console.timeEnd('let');
console.time('let2');
testlet2();
console.timeEnd('let2'); Run Code Online (Sandbox Code Playgroud)
如何let在代码中的位置导致如此大的性能差异?
我会采取有根据的猜测,并说时间死区是罪魁祸首.
这个循环,这似乎是你的微基准是什么,是由优化的早餐吃的维亚切斯拉夫·叶戈罗夫喜欢把它在他的会谈.即使它不是,并且引擎将增加变量一百万次,在两个函数中将花费相同的时间.
不同的a是创建变量的时候.在你的第一个片段中,它位于函数的开头,之前没有任何内容.没有临时死区,它本质上是一个函数范围变量; 将它改为a var不会有所作为(尝试一下).因此,当调用函数时,创建带有变量的范围并将值初始化为0,然后运行(或不运行)某些代码.
相反,在第二个片段中存在时间死区.在let声明之前的代码中,访问a必须抛出异常.因此,当调用该函数时,将创建范围并a保留一个插槽,但保留未初始化.在这种状态下,代码运行(或不运行),只有在此之后变量才会被初始化并赋值0.
因此,如果let它位于代码中(或之后),则范围更加复杂.这可能会导致优化器以不同方式对待它,甚至可能会影响i同一范围内的变量,或者可能根本无法进行某些优化.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |