使用let和var定义变量为什么会对下面代码的执行时间产生很大影响?
发布于 7 年前 作者 ll929 3554 次浏览 来自 问答

let.pngvar.png

let values = [];
for(let i = 0;i < 10000000;i++){
    values.push(i)
}
let iterations = Math.ceil(values.length / 8),
    startAt = values.length % 8,
    i = 0;
function process(item){
    item++;
}
console.time('b');
for (let i = 0;i < values.length;i++){
    process(values[i])
}
console.timeEnd('b');

使用let和var定义变量为什么会对上述代码执行时间产生很大影响?

8 回复

等有空试试,看不出来。

试了一下确实是这个现象,但是理论上感觉用var会去检查作用域上的同名变量,而使用let不用考虑速度应该会快一些啊,希望其他人能够解答

V8引擎对于let还在优化当中, 以后应该就会好了, 个人认为

node --trace-opt-verbose 了一下发现 v8 是没有优化这部分代码 reason: Unsupported phi use of const or let variable 这里有讨论

@ouyangxuanyun @151263 还有一个关键点是for循环中的代码并没有用到var或let定义的变量。

来自酷炫的 CNodeMD

@eggggger 谢谢@eggggger

来自酷炫的 CNodeMD

let values = [];
let iterations = Math.ceil(values.length / 8),
    startAt = values.length % 8,
    i = 0;
for(let i = 0;i < 10000000;i++){
    values.push(i)
}
function process(item){
    item++;
}
console.time('b');
for (let i = 0; i < values.length; i++){
    process(values[i])
}
console.timeEnd('b');

屏幕截图 2017-03-29 10:35:12.png

这提醒我们千万要把变量的声名提到代码顶部,效率差10倍。现在我知道airbnb的苦心了。其实var的效率好像只是let的2倍左右。我猜是这样的。

回到顶部