代码之家  ›  专栏  ›  技术社区  ›  Sagar

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

  •  2
  • Sagar  · 技术社区  · 3 年前

    几周前,我听说 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 回复  |  直到 3 年前
        1
  •  1
  •   Arnav Thorat natanavra    3 年前

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


    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");

    它访问 圈外 换句话说,它只访问 一次,与坏代码相比,坏代码访问它五次。

    您可以看到,通过定义变量,它减少了获取 远离物业,从而提高性能!


    总之,好的循环速度更快,因为它只需要访问 财产一次!