Performance ES6扩展元素与嵌套forEach性能

Performance ES6扩展元素与嵌套forEach性能,performance,ecmascript-6,Performance,Ecmascript 6,我有以下功能 const modules = [{courses:[...]},{courses:[...]},...] const deleteCourses = []; modules.forEach((mod) => { mod.courses.forEach((course) => { deleteCourses.push(course)); } // versus deleteCourses = [...deleteCours

我有以下功能

const modules = [{courses:[...]},{courses:[...]},...]
const deleteCourses = [];
modules.forEach((mod) => {
    mod.courses.forEach((course) => {
        deleteCourses.push(course));
    }
    // versus
    deleteCourses = [...deleteCourses, ...mod.courses];
});
假设模块和课程的长度在30-100之间,我想知道哪一个更有效

一方面,我被教导避免嵌套
forEach
循环。另一方面,数组文字每次都创建一个新的
数组
实例


谢谢

嵌套的forEach似乎要快得多,如下所示:

设置:

const modules = Array(30).fill({courses:Array(30).fill(1)}) //30x30 elements
let deleteCourses = [];
案例1:嵌套forEach-29293操作/秒

情况2:ES6扩展运算符-49.13 ops/sec

对于30x30的样品来说,这大约快了600倍

在每次迭代中重新考虑<代码> DELTECTURES的冗余量时,这是有意义的。与嵌套forEach相比,每次迭代执行的加法操作的数量大约是该迭代的

deleteCourses
长度。这个数字在每次迭代中都在增长

因此,性能上的差异与创建新的
数组
实例没有多大关系,而与错误使用扩展运算符所产生的大量冗余步骤有很大关系

可以肯定的是,单独来看这两个案例,我们可以看到:

  • ES6扩展运算符算法是指数的:
    O(2^n)
  • 嵌套forEach算法是线性的:
    O(n)

    • 嵌套的forEach似乎要快得多,如图所示:

      设置:

      const modules = Array(30).fill({courses:Array(30).fill(1)}) //30x30 elements
      let deleteCourses = [];
      
      案例1:嵌套forEach-29293操作/秒

      情况2:ES6扩展运算符-49.13操作/秒

      对于30x30的样品来说,这大约快了600倍

      在每次迭代中重新考虑<代码> DELTECTURES的冗余量时,这是有意义的。与嵌套forEach相比,每次迭代执行的加法操作的数量大约是该迭代的

      deleteCourses
      长度。这个数字在每次迭代中都在增长

      因此,性能上的差异与创建新的
      数组
      实例没有多大关系,而与错误使用扩展运算符所产生的大量冗余步骤有很大关系

      可以肯定的是,单独来看这两个案例,我们可以看到:

      • ES6扩展运算符算法是指数的:
        O(2^n)
      • 嵌套forEach算法是线性的:
        O(n)

      FWIW,扩展元素不创建数组。数组文本(
      []
      )负责创建数组。因为对于这个问题,使用扩展元素的事实可能并不重要。您也可以使用
      [].concat(deleteCourses,mod.courses)
      .FWIW,扩展元素不创建数组。数组文本(
      []
      )负责创建数组。因为对于这个问题,使用扩展元素的事实可能并不重要。您也可以使用
      [].concat(删除课程,修改课程)
      。感谢您的链接!!对于测试我的减速机函数来说,它很有用:)请。它是二次的,不是指数的。谢谢你的链接!!这对测试我的减缩函数很有用:)拜托,它是二次函数,不是指数函数。
      modules.forEach((mod) => {
          deleteCourses = [...deleteCourses, ...mod.courses];
      })