哪个更节省内存,对象初始值设定项或数组?

Which saves more memory, Object initializer or Array?

假设一个对象包含两个字段 idname。我想在一个数组中存储 10000 个这样的对象。我有以下两个选择:

选项 1

var pairs = [];
for(var i=0; i<10000; i++) {
  pairs.push({"id": i, "name": "xxx"});
}

选项 2

var pairs = [];
for(var i=0; i<10000; i++) {
  pairs.push([i, "xxx"]);
}

假设不需要存储密钥,哪个选项的结果 pairs 可以节省更多内存?有没有更好的选项可以提高内存效率?

你可以测量它们。

对于所有示例,我将静态 "xxx" 字符串更改为更真实的内容(即每个 id 唯一)。

t1t2 是你的,t3 是我的更节省内存布局的想法,a pair of "array-of-structs",一个用于 id,一个用于名字。

const process = require("process");

function t1() {
  var pairs = [];
  for (var i = 0; i < 10000; i++) {
    pairs.push({ id: i, name: i.toString(36) });
  }
  return pairs;
}

function t2() {
  var pairs = [];
  for (var i = 0; i < 10000; i++) {
    pairs.push([i, i.toString(36)]);
  }
  return pairs;
}
function t3() {
  var names = [];
  var ids = [];
  for (var i = 0; i < 10000; i++) {
    ids.push(i);
    names.push(i.toString(36));
  }
  return [ids, names];
}

const funcs = { t1, t2, t3 };
const func = funcs[process.argv[process.argv.length - 1]];
const m1 = process.memoryUsage();
console.log(func);
const x = func();
const m2 = process.memoryUsage();
console.log(m2.rss - m1.rss);

在我的节点 16 中,输出:

$ node so-memory-test.js t1
[Function: t1]
4018176
$ node so-memory-test.js t2
[Function: t2]
4759552
$ node so-memory-test.js t3
[Function: t3]
1622016

这意味着 AoS 结构是最薄的。