javascript - 在 V8 中,为什么预分配数组消耗更少的内存?

标签 javascript arrays memory v8

考虑以下两种选择:

  const mb_before = process.memoryUsage().heapUsed / 1024 / 1024;
  const n = 15849;
  const o = 115;
  const entries = [];
  for (var i = 0; i < n; i++) {
    const subarr = [];
    for (var j = 0; j < o; j++) {
      subarr.push(Math.random());
    }
    entries.push(subarr);
  }
  const mb_after = process.memoryUsage().heapUsed / 1024 / 1024;
  console.log('arr using ' + (mb_after - mb_before) + ' megabyte');
  // arr using 15.110992431640625 megabyte

  const mb_before = process.memoryUsage().heapUsed / 1024 / 1024;
  const n = 15849;
  const o = 115;
  const entries = new Array(n);
  for (var i = 0; i < n; i++) {
    const subarr = new Array(o);
    for (var j = 0; j < o; j++) {
      subarr[j] = Math.random();
    }
    entries[i] = subarr;
  }
  const mb_after = process.memoryUsage().heapUsed / 1024 / 1024;
  console.log('arr using ' + (mb_after - mb_before) + ' megabyte');
  // arr using 12.118911743164062 megabyte

根据我的理解,两个数组的大小应该相同,只是它们的实例化方式不同。如何解释所产生的内存使用量始终不同?

最佳答案

我相信这与数组内存的分配方式有关。当您实例化一个数组并为其指定特定大小(如第二个示例中所示)时,它将分配该内存。

当你增长数组时,它会分配少量的额外空间来处理增长,然后当你增长数组时,额外的内存分配会变得更大。这会在第一个示例中产生额外的可用空间。

关于javascript - 在 V8 中,为什么预分配数组消耗更少的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42403625/

相关文章:

Javascript:直接用索引替换 Array.splice()

javascript - JS手机: how many memory I have available

c - 在c中的结构中声明和填充二维数组

c++ - 将动态二维数组在 C++ 和 Fortran 之间传递

C - 函数返回二维数组

c - 在 C 中保留 RAM

javascript - 使用 Webpack 为其他项目编译 typescript

javascript - 如何使用 chart.js 创建两个 x 轴标签

python - 在 Virtualenv 中测试 python 框架的内存使用情况

c - 通过字符串引用传递