为什么在循环外声明变量更快?

Why is declaring a variable outside of the loop more faster?

几周前,我听说在循环外声明 true/false 条件变量更快。所以,我想试试看。


所以,基本上,我编写这段代码是为了看看哪个更快。

这是两个循环。

// Initialization
const arr = [1, 2, 3, 4, 5];

// Bad Loop
console.time("bad");

for (let i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}

console.timeEnd("bad");

// Good Loop
console.time("good");

let l = arr.length;
for (let i = 0; i < l; i++) {
  console.log(arr[i]);
}

console.timeEnd("good");

当代码为 运行 时,运行 坏循环所花费的时间与好循环所花费的时间存在显着差异。 (无论坏循环有多快,好循环总是更快。)


所以,我的问题是 为什么会这样?两个循环之间的唯一区别是好的循环在循环开始之前定义数组长度,而坏循环在循环中获取它。

基本上,这就是为什么坏循环中的代码比好循环慢的原因。


1.坏循环为什么慢?

首先,让我们看一下坏循环。

const arr = [1, 2, 3, 4, 5];

console.time("Bad");

for (let i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}

console.timeEnd("Bad");

使这个循环变慢的原因是它 每次迭代都访问 length 属性 .

这会大大降低性能,因为五次(在这种情况下),它必须访问 属性。

如您所见,坏循环变慢也就不足为奇了。


2。为什么好的循环这么快?

看看好的循环:

const arr = [1, 2, 3, 4, 5];

console.time("Good");

let l = arr.length;
for (let i = 0; i < l; i++) {
  console.log(arr[i]);
}

console.timeEnd("Good");

您可以看到它更快的原因是因为它在循环 之外访问length。换句话说,它只访问了 length 一次,而错误的代码访问了它五次。

您可以看到,通过定义变量,它减少了从远处获取 length 属性 所花费的时间,从而提高了性能!


总之,好的循环更快,因为它只需要访问 length 属性 一次!